一、定时任务很多都是配置在配置文件中,但很多时候我们需要根据业务需要调整动态增删改定时任务,这里写出例子供大家参考。
(1)maven依赖
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>2.1.5</version>
</dependency>
(2)application.properties文件设置
elasticjob.serverlists=192.168.25.133:2181
elasticjob.namespace=boot-job
(3)初始化关于elastic的配置
@Configuration
@Data
public class ElasticJobConfig {
@Value("${elasticjob.serverlists}")
private String serverLists;
@Value("${elasticjob.namespace}")
private String namespace;
@Bean
public ZookeeperConfiguration zConfig(){
return new ZookeeperConfiguration(serverLists, namespace);
}
@Bean(initMethod = "init")
public ZookeeperRegistryCenter registryCenter(ZookeeperConfiguration config){
return new ZookeeperRegistryCenter(config);
}
@Bean
public ElasticJobListener elasticJobListener(){
return new ElasticJobListener(100, 100);
}
}
(4)设置ElasticJobHandler的具体增删改的处理类
@Component
public class ElasticJobHandler {
@Resource
private ZookeeperRegistryCenter registryCenter;
@Resource
private ElasticJobListener elasticJobListener;
private static LiteJobConfiguration.Builder simpleJobConfigBuilder(String jobName,
Class<? extends SimpleJob> jobClass,
int shardTotalCount,
String cron,
String id) {
return LiteJobConfiguration.newBuilder(new SimpleJobConfiguration(
JobCoreConfiguration.newBuilder(jobName,cron,shardTotalCount).jobParameter(id).build(),jobClass.getCanonicalName()
));
}
/**
* 添加一个定时任务
*/
public void addJob(String jobName, SimpleJob jobInstance, String cron, Integer shardTotalCount, String id) {
LiteJobConfiguration jobConfig = simpleJobConfigBuilder(jobName, jobInstance.getClass(), shardTotalCount, cron, id)
.overwrite(true).build();
new SpringJobScheduler(jobInstance,registryCenter,jobConfig,elasticJobListener).init();
}
/**
* 更新定时任务
* @param jobName
* @param cron
*/
public void updateJob(String jobName, String cron) {
JobRegistry.getInstance().getJobScheduleController(jobName).rescheduleJob(cron);
}
/**
* 删除定时任务
* @param jobName
*/
public void removeJob(String jobName){
JobRegistry.getInstance().getJobScheduleController(jobName).shutdown();
}
}
(5)配置一下关于ElasticJobListener的监听器
public class ElasticJobListener extends AbstractDistributeOnceElasticJobListener {
public ElasticJobListener(long startedTimeoutMilliseconds, long completedTimeoutMilliseconds) {
super(startedTimeoutMilliseconds,completedTimeoutMilliseconds);
}
@Override
public void doBeforeJobExecutedAtLastStarted(ShardingContexts shardingContexts) {
}
@Override
public void doAfterJobExecutedAtLastCompleted(ShardingContexts shardingContexts) {
}
}
(6)这里写出cron定时任务工具类(此案例可以不需要此类)
public class CronUtils {
//private static final DateTimeFormatter SDF=DateTimeFormatter.ofPattern("ss mm HH dd MM ? yyyy");
private static final ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("ss mm HH dd MM ? yyyy");
}
};
/**
* eg "0 27 23 14 10 ? 2019"
*
* @param date
* @return
*/
public static String getCron(Date date) {
if (Objects.isNull(date)) {
return null;
}
return threadLocal.get().format(date);
}
public static void main(String[] args) {
System.out.println(getCron(new Date()));
}
}
(7)设置controller测试 效果
@Controller
@RequestMapping("/elastic/test")
public class ElasticController {
@Autowired
private ElasticJobHandler jobHandler;
@GetMapping("addJob")
public void addJob(){
jobHandler.addJob("111", new MyElasticJob(), "0 0/1 * * * ?", 1, "1");
}
@GetMapping("updateJob")
public void updateJob(){
jobHandler.updateJob("111","0 0/3 * * * ?");
}
@GetMapping("removeJob")
public void removeJob(){
jobHandler.removeJob("111");
}
}
测试结果(分别执行完(任务的添加,修改,删除)的结果)
执行第111@-@0@-@READY@-@192.168.25.1@-@28648任务2019-10-14 23:33:00
执行第111@-@0@-@READY@-@192.168.25.1@-@28648任务2019-10-14 23:34:00
执行第111@-@0@-@READY@-@192.168.25.1@-@28648任务2019-10-14 23:35:00
执行第111@-@0@-@READY@-@192.168.25.1@-@28648任务2019-10-14 23:36:00
执行第111@-@0@-@READY@-@192.168.25.1@-@28648任务2019-10-14 23:39:00
执行第111@-@0@-@READY@-@192.168.25.1@-@28648任务2019-10-14 23:42:00
2019-10-14 23:43:02.193 INFO 28648 --- [nio-8080-exec-9] org.quartz.core.QuartzScheduler : Scheduler 111_$_NON_CLUSTERED shutting down.
2019-10-14 23:43:02.193 INFO 28648 --- [nio-8080-exec-9] org.quartz.core.QuartzScheduler : Scheduler 111_$_NON_CLUSTERED paused.
2019-10-14 23:43:02.282 INFO 28648 --- [nio-8080-exec-9] org.quartz.core.QuartzScheduler : Scheduler 111_$_NON_CLUSTERED shutdown complete.