动态作业计划Quartz

时间:2018-02-05 07:13:17

标签: java spring-boot quartz-scheduler

是否可以添加/删除/修改使用我的门户网站的最终用户动态(在运行时)在Quartz + Spring Boot中安排的Job。由于无法从外部访问时间表start(),我不知道有什么办法。基本上我需要将所有计划信息存储到数据库中并访问它们。 Im建设的门户网站将被大量用户使用,这将是实现这一目标的正确解决方案吗?

否则我可以使用下面的cron

@Scheduled(cron = "0 5 * * * *")

每5分钟扫描一次作业就可以实现这一目标。

1 个答案:

答案 0 :(得分:0)

这绝对是可能的。

您只需自动安装调度程序,每当您的用户想要更改任务时,您都会使用Scheduler#scheduleJobScheduler.deleteJobMethodInvokingJobDetailFactoryBean实例(代表作业)。 要创建cron作业触发器,请使用Trigger类。

我的代码中没有可运行的摘录(EtlManager是我希望运行的方法的专有类,etlTask​​是包含运行频率的持久信息的对​​象等):

@Autowired
private Scheduler scheduler;

在对用户添加新任务的方法中做出反应:

        MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
        EtlManager em = this.appContext.getBean(etlTask.getTask().getExeClass(), EtlManager.class);
        jobDetail.setTargetObject(em);
        jobDetail.setTargetMethod("run");
        jobDetail.setName(etlTask.getAppTaskCode());
        jobDetail.setGroup(this.appCode);
        jobDetail.setConcurrent(false);

        jobDetail.afterPropertiesSet();

        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("CRON" + etlTask.getTiming().getId(), this.appCode)
                .withSchedule(CronScheduleBuilder.cronSchedule(etlTask.getTiming().getCronExpression())
                .withMisfireHandlingInstructionDoNothing())
                .startAt(etlTask.getTiming().getStartAfter()) //
                .build();

        scheduler.scheduleJob((JobDetail) jobDetail.getObject(), trigger);

此处的QA也非常相似,不确定100%是否重复:Java Example: Dynamic Job Scheduling with Quartz