elasticJob实现动态增加定时任务、动态增加定时任务、动态修改定时任务

2022-06-20 11:17:11

一、定时任务很多都是配置在配置文件中,但很多时候我们需要根据业务需要调整动态增删改定时任务,这里写出例子供大家参考。
(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.
  • 作者:筏镜
  • 原文链接:https://blog.csdn.net/fajing_feiyue/article/details/102559060
    更新时间:2022-06-20 11:17:11