集群环境下_集群环境下指定机器运行后台定时任务

在集群环境中,确保特定机器执行后台任务以避免数据处理冲突是关键。本文介绍了一种使用@Conditional注解的方法,通过判断IP来决定是否加载任务服务到Spring容器,从而实现指定机器执行定时任务的需求。
摘要由CSDN通过智能技术生成

47719245dd89c60da255bddeaa6326f4.png

集群环境下,机器会有多个,需要执行某个或者多个机器执行后台任务,否则可能会一个数据多个机器同时处理导致bug。这在实际工作中很常见。最近项目中也有类似需求,下面是一种实现方式,供大家参考。

使用 @Conditional 注解,判断是本机ip才加载对应的任务的service,非配置的ip的机器则不会加载到spring容器。

IP判断类

package cn.xiaowenjie.iptask;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

import java.net.InetAddress;

/**
 * 判断是否为本机ip
 *
 * @author 晓风轻
 */
@Slf4j
public class IPCondition implements Condition {

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        String runTaskIP = conditionContext.getEnvironment().getProperty("run.task.ip");
        String localIP = this.getLocalIP();

        log.info("local ip: {} , run Task IP: {}" ,localIP , runTaskIP);

        return runTaskIP.equals(localIP);
    }

    @SneakyThrows
    public String getLocalIP(){
        InetAddress address = InetAddress.getLocalHost();
        return address.getHostAddress();
    }
}

后台任务类

package cn.xiaowenjie.iptask;


import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Conditional;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

/**
 * 后台定时任务
 *
 * @author 晓风轻
 */
@Service
@Slf4j
@Conditional(IPCondition.class)
public class BackService {

    @PostConstruct
    public void init(){
        log.info("i run task...");
    }

    @Scheduled(cron = "0/10 * * * * *")
    public void scheduleTask(){
        log.info("task running....");
    }
}

实际效果

[           main] cn.xiaowenjie.iptask.IPCondition         : local ip: 192.168.1.101 , run Task IP: 192.168.1.101
[           main] cn.xiaowenjie.iptask.IPCondition         : local ip: 192.168.1.101 , run Task IP: 192.168.1.101
[           main] cn.xiaowenjie.iptask.IPCondition         : local ip: 192.168.1.101 , run Task IP: 192.168.1.101
[           main] cn.xiaowenjie.iptask.BackService         : i run task...
[           main] o.s.s.c.ThreadPoolTaskScheduler          : Initializing ExecutorService 'taskScheduler'
[           main] cn.xiaowenjie.iptask.IptaskApplication   : Started IptaskApplication in 1.364 seconds (JVM running for 2.098)
[   scheduling-1] cn.xiaowenjie.iptask.BackService         : task running....
[   scheduling-1] cn.xiaowenjie.iptask.BackService         : task running....
[   scheduling-1] cn.xiaowenjie.iptask.BackService         : task running....
[   scheduling-1] cn.xiaowenjie.iptask.BackService         : task running....

代码下载

xwjie/xiaofengqingjava​github.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值