ElasticJob实现连环任务(动态添加, 动态修改)

默认看这篇文章已经了解过ElasticJob.

需要添加的pom:

<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-core</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-spring</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-api-core</artifactId>
<version>1.1.1</version>
</dependency>

首先了解下动态添加任务

代码如下 :

private static CoordinatorRegistryCenter setUpRegistryCenter() {
ZookeeperConfiguration zkConfig = new ZookeeperConfiguration("zk注册地址", "任务的注册空间名");//注册空间名称这里有点混, 建议去zk后台查看, 注册空间和名称和命名空间可能不一致.
CoordinatorRegistryCenter result = new ZookeeperRegistryCenter(zkConfig);
result.init();
return result;
}
CoordinatorRegistryCenter regCenter = setUpRegistryCenter();
JobConfiguration jobConfig = JobConfigurationFactory.createSimpleJobConfigurationBuilder("任务名称", TestJob.class (这里是你需要实现的类), 3, "0/6 * * * * ?").overwrite(true).build();
new JobScheduler(regCenter, jobConfig, new JavaSimpleListener()).init();

附:
public class TestJob  extends AbstractSimpleElasticJob {
@Override
public void process(final JobExecutionMultipleShardingContext shardingContext) {
System.out.println("===========================");
System.out.println("simple job execute end");
}
}
动态修改任务属性 ,这里以修改cron为例 :
public void updateJobCron(String jobName, String cron) {
CoordinatorRegistryCenter regCenter = setUpRegistryCenter(); //获取注册中心实例
JobSettingsAPI jobSettingsAPI = new JobSettingsAPIImpl(regCenter); //获取修改API实例
JobSettings jobSettings = jobSettingsAPI.getJobSettings(jobName); //获取之前任务
jobSettings.setCron(cron); //修改你需要的数据
jobSettingsAPI.updateJobSettings(jobSettings); //发起更新
System.out.println(jobName + " change finish");
}

连环任务设置 :
主要应用场景, 需要不确定时间的任务分片, 在一个任务完成以后启动另一个任务.

实现方式 :
两种, 一种通过代码注入, 一种通过配置文件 , 通过监听器实现.
代码注入 :
创建任务的时候
new JobScheduler(regCenter, jobConfig, new JavaSimpleListener()).init();

通过配置文件 :
<job:simple id="myElasticJob"
class="xxxx.xxx.xxxx.MyElasticJob"
registry-center-ref="regCenter"
cron="0 * 0/1 * * ? *"
sharding-total-count="6"
sharding-item-parameters="0=A,1=B,2=C,3=D,4=E,5=F"
failover="true"
description="监听器测试用"
monitor-execution="${job.monitorExecution}"
overwrite="true">
<job:listener class="xxx.JavaSimpleListener"/> //在这里添加监听器
</job:simple>

附:
public class JavaSimpleListener implements ElasticJobListener {

@Override
public void beforeJobExecuted(JobExecutionMultipleShardingContext jobExecutionMultipleShardingContext) { //任务执行前执行
System.out.println("================================");
}

@Override
public void afterJobExecuted(JobExecutionMultipleShardingContext jobExecutionMultipleShardingContext) { //任务执行后执行
      System.out.println("================================");
}
}
在最开始任务完成后, 将下一个任务的cron修改为 5秒后执行, 然后在那个任务执行好之后在那个任务的监听器再修改回原来的一年后执行.












原文地址:https://www.cnblogs.com/Mazexal/p/9401747.html