1、Elastic Job简介
elastic-job是当当开源的一款非常好用的作业框架,在这之前,我们开发定时任务一般都是使用quartz或者spring-task(ScheduledExecutorService),无论是使用quartz还是spring-task,我们都会至少遇到两个痛点:
不敢轻易跟着应用服务多节点部署,可能会重复多次执行而引发系统逻辑的错误。
quartz的集群仅仅只是用来HA,节点数量的增加并不能给我们的每次执行效率带来提升,即不能实现水平扩展。
Elastic job是当当网架构师张亮,曹昊和江树建基于Zookepper、Quartz开发并开源的一个Java分布式定时任务,解决了Quartz不支持分布式的弊端。Elastic job主要的功能有支持弹性扩容,通过Zookepper集中管理和监控job,支持失效转移等。项目由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。
2、使用Elastic Job实现静态定时任务
2.1 pom.xml引入依赖包
<dependency><groupId>com.github.kuhn-he</groupId><artifactId>elastic-job-lite-spring-boot-starter</artifactId><version>2.1.5</version></dependency>
2.2 application.properties配置文件中添加配置zookeeper服务地址信息以及注册的命名空间名字
server.port=8080
spring.application.name=elastic-job-02
elaticjob.zookeeper.server-lists=192.168.1.12:2181
elaticjob.zookeeper.namespace=job1
2.3 静态定时符务实现类StaticJobTask.java
@ElasticSimpleJob(
jobName="${elaticjob.zookeeper.namespace}", // 指定Zookeeper中的命名空间
shardingTotalCount= 1, //分版cron="0/10 * * * * ? *" //cron表达式)
@Component
public class StaticJobTask implements SimpleJob{
@Override
public void execute(ShardingContext shardingContext){
System.out.println("---------静态定时任务测试----------------");}}
3、使用Elastic Job实现静态定时任务
3.1 application.properties配置信息
elaticjob.zookeeper.dynamiczk=192.168.1.12:2181
elaticjob.zookeeper.namespace2=job2
3.2 向zk进行注册,DynamicConfig.java
@Configuration
public class DynamicConfig{
@Value("${elaticjob.zookeeper.dynamiczk}")
private String dynamiczk;
@Value("${elaticjob.zookeeper.namespace2}")
private String dynamicnamespace;
@Bean
public ZookeeperConfiguration zookeeperConfiguration(){return new ZookeeperConfiguration(dynamiczk,dynamicnamespace);}
@Bean(initMethod="init")
public ZookeeperRegistryCenter zookeeperRegistryCenter(ZookeeperConfiguration zookeeperConfiguration){return new ZookeeperRegistryCenter(zookeeperConfiguration);}}
3.3 动态创建定时任务工具类
@Component
public class DynamicTaskAdd{
@Autowired
private ZookeeperRegistryCenter zookeeperRegistryCenter;
/***
* 动态创建定时任务
* @param jobName:定时任务名称
* @param cron:表达式
* @param shardingTotalCount:分片数量
* @param instance:定时任务实例
* @param parameters:参数
*/
public void create(String jobName, String cron, int shardingTotalCount, SimpleJob instance,String parameters){
LiteJobConfiguration.Builder builder= LiteJobConfiguration.newBuilder(new SimpleJobConfiguration(
JobCoreConfiguration.newBuilder(
jobName,
cron,
shardingTotalCount).jobParameter(parameters).build(),
instance.getClass().getName())).overwrite(true);
LiteJobConfiguration liteJobConfiguration= builder.build();
new SpringJobScheduler(instance,zookeeperRegistryCenter,liteJobConfiguration).init();}}
3.4 定时任务类,DynamicJob.java
public class DynamicJob implements SimpleJob{
@Override
public void execute(ShardingContext shardingContext){
// 参数
String JobParameter= shardingContext.getJobParameter();
System.out.println("---------DynamicJob-------------:" + JobParameter);}}
3.5 在controller中动态创建动态定时任务,TestJobController.java
@RestController
public class TestJobController{
@Autowired
private DynamicTaskAdd dynamicTaskAdd;
@GetMapping("/jobtest")
public void test(){
// cron表达式
Stringcron="47 59 08 09 04 ? 2021";
dynamicTaskAdd.create("job001", cron, 1, new DynamicJob(),"test");}}
浏览器中访问 http://localhost:8080/jobtest 到指定时间,控制台会输出