这篇主要是讲整合的应用,至于原理什么的大家可以去官方文档熟悉,直接上手。Elastic-Job呢是一个分布式调度解决方案,当当网开源,主要场景就是做定时任务。
好,开整,就你手头现有的Boot项目或者Cloud项目都可以直接引。
Boot版本:2.1.3,Cloud:Edgware
1. 需要Zookeeper作支撑
随便选一个版本下载,我这下的是3.5.9
先进conf目录下找到zoo_sample.cfg文件,直接改名zoo.cfg,里面的内容无需改动。
再进bin目录,找到zkServer.cmd,双击启动,这个文件就是Windows启动Zookeeper的启动文件。.sh文件是在Linux上启动的。zkCli是客户端,咱暂时用不上。
好,启动成功,可以看到端口号是2181。至此,Zookeeper就在咱电脑上了。
2. 一个任务小试牛刀
2.1 引入依赖
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>2.1.5</version>
<exclusions>
<exclusion>
<artifactId>curator-client</artifactId>
<groupId>org.apache.curator</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>2.11.1</version>
</dependency>
细看上面的依赖,为啥多此一举呢,看这篇文章详解:
curator-client的依赖问题
另外,只需引入elastic-job-lite-spring就足够。
2.2 走代码
@Component
public class TestElasticJobs implements SimpleJob {
private static final Logger LOGGER = LoggerFactory.getLogger(TestElasticJobs.class);
@Override
public void execute(ShardingContext shardingContext) {
LOGGER.info("定时任务开始了~~~~~,{}", LocalDateTime.now());
}
}
一个小小的测试类。@Component注解一定得有,不然Spring池子里没有,还需要实现SimpleJob,这是Elastic-Job三种类型之一(具体了解请移步官方文档),也是最常用的一种。
@Configuration
public class RegistryCenterConfig {
@Value("${zooKeeperConfig.serverLists}")
private String serverLists;
@Value("${zooKeeperConfig.namespace}")
private String namespace;
@Bean(initMethod = "init")
public CoordinatorRegistryCenter registryCenter(){
ZookeeperConfiguration configuration = new ZookeeperConfiguration(serverLists,namespace);
configuration.setSessionTimeoutMilliseconds(100);
//最大重试次数,默认为3
configuration.setMaxRetries(4);
return new ZookeeperRegistryCenter(configuration);
}
}
Zookeeper注册中心,一个配置类。serverLists和namespace可以在这里写,也可配置到yml文件中。serverLists是连接Zookeeper服务器的列表,还记得咱们启动Zookeeper时的端口吧,就写这儿,本机自己跑直接来localhost:2181就好,或者自己的IP地址。namespace是命名空间,名字随便起就好。ZookeeperConfiguration对象呢可以自己进类中去看,都是中文,好理解的很,可以试着配着玩玩。欧克,注册中心完事儿。
@Configuration
public class ElasticJobConfig {
@Resource
private CoordinatorRegistryCenter registryCenter;
private LiteJobConfiguration jobConfiguration(Class<? extends ElasticJob> clazz,String cron,Integer shardingTotalCount,String shardingItemParameters){
Builder builder = JobCoreConfiguration.newBuilder(clazz.getSimpleName(), cron, shardingTotalCount);
if (StringUtils.isNotEmpty(shardingItemParameters)) {
builder.shardingItemParameters(shardingItemParameters);
}
//定义作业核心配置
JobCoreConfiguration jobCoreConfiguration = builder.build();
//定义Simple类型配置
SimpleJobConfiguration simpleConfig = new SimpleJobConfiguration(jobCoreConfiguration, TestElasticJobs.class.getCanonicalName());
//定义Lite作业根配置
return LiteJobConfiguration.newBuilder(simpleConfig).overwrite(true).build();
}
@Bean(initMethod = "init")
public SpringJobScheduler jobScheduler(TestElasticJobs elasticJob){
//要保证Task类名与之前不同
return new SpringJobScheduler(elasticJob,registryCenter,jobConfiguration(elasticJob.getClass(),"0/5 * * * * ?",1,null));
}
}
作业调度配置类。执行定时任务的地方,下面的Bean类就要引用之前的那个测试任务,主要就需要一个cron表达式,就是什么时候执行,我写的这个 “0/5 * * * * ?” 就是说每5秒执行一次,其他的时间可以度娘cron,方便的很。上面的方法则是SimpleJob的配置,这里不做叙述。
欧克,现在我们启动服务康康
成功啦成功啦
3. 举一反三来一波
上面呢只是一个任务,咱们多搞几个,咋多搞呢,一、多写一个测试任务类。二、作业调度中多加一个Bean,挺简单哈。
瞅瞅,是不是搞定了
把类名对应上,两个Bean无大差别,只是jobConfiguration方法的参数需要自己重新设定,主要也就是cron式子啦。再次启动服务,两个任务就都执行起来了。
欧克,整合到这就差不多了,我也就是写个小Demo,如果有任何问题欢迎讨论~