最近这段时间项目改造的需求是一个接着一个,不少前人挖的深坑都得让我们这帮后人们填埋进去,但是项目运行了七八年了,已经不能满足新需求开发要求的迅速和规范。所以开发组研究决定,分步骤的解决这些历史遗留的问题。
首先解决的就是定时任务的调度问题,因为系统中有很多过滤数据以及对外同步数据的job,统计起来有五六十个定时任务,这些任务分别部署在两台机器上,因为定时时间都是设定的一样的,导致有时候同一个定时任务会被执行两次,这样的话会造成数据的混乱。
这是第一个要解决的问题,因为每天维护那些因为定时任务执行两次造成的错误数据就非常让人头疼,首先想到的是用Springcloud的注册中心,后来想到本地开发一直在用zookeeper+dubbo的RPC架构,就想到完全可以利用zookeeper做定时任务的调度中心。
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.zen.elasticjob.spring.boot.annotation.ElasticJobConfig;
import lombok.extern.log4j.Log4j;
@Log4j
@ElasticJobConfig(cron = "0 5 0 * * ?", shardingTotalCount = 1,
shardingItemParameters = "0=testJobA,1=testJobB",
startedTimeoutMilliseconds = 5000L,
completedTimeoutMilliseconds = 10000L)
public class testJob implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
log.error("定时任务开始执行");
//todo 这里执行定时任务
}
}
基于标签的使用,实现的过程非常简单。这样的话就可以将全部的定时任务从两台机器上分别注册到zookeeper上面,一台机器挂掉的话,则会立刻重启另一台机器。并且不会有同一个任务同步两次的情况出现。