@Bean
public JobDetail jobDetail() {
return JobBuilder.newJob().ofType(SampleJob.class)
.storeDurably()
.withIdentity("Qrtz_Job_Detail")
.withDescription("Invoke Sample Job service...")
.build();
}
@Bean
public Trigger trigger(JobDetail job) {
return TriggerBuilder.newTrigger().forJob(job)
.withIdentity("Qrtz_Trigger")
.withDescription("Sample trigger")
.withSchedule(simpleSchedule().repeatForever().withIntervalInHours(1))
.build();
}
最简单的方法是通过扩展SpringBeanJobFactory和@override
createJobInstance方法进行一些配置。然后需要定义SchedulerFactoryBean,最后定义调度程序:
@Configuration
public class SchedulerConfiguration {
public class AutowireCapableBeanJobFactory extends SpringBeanJobFactory {
private final AutowireCapableBeanFactory beanFactory;
@Autowired
public AutowireCapableBeanJobFactory(AutowireCapableBeanFactory beanFactory) {
Assert.notNull(beanFactory, "Bean factory must not be null");
this.beanFactory = beanFactory;
}
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
this.beanFactory.autowireBean(jobInstance);
this.beanFactory.initializeBean(jobInstance, null);
return jobInstance;
}
}
@Bean
public SchedulerFactoryBean schedulerFactory(ApplicationContext applicationContext) {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobFactory(new AutowireCapableBeanJobFactory(applicationContext.getAutowireCapableBeanFactory()));
return schedulerFactoryBean;
}
@Bean
public Scheduler scheduler(ApplicationContext applicationContext) throws SchedulerException {
Scheduler scheduler = schedulerFactory(applicationContext).getScheduler();
scheduler.start();
return scheduler;
}
}
然后,在应用程序的任何地方,例如在RestController中,您都可以访问调度程序并调度新作业:
@RestController
public class ScheduleController {
@Autowired
private Scheduler scheduler;
@GetMapping(value = "/schedule/{detail}/{desc}")
public String scheduleJob(@PathVariable(value = "detail") String detail, @PathVariable(value = "desc") String desc) throws SchedulerException {
JobDetail job = newJob(detail, desc);
return scheduler.scheduleJob(job, trigger(job)).toString();
}
private JobDetail newJob(String identity, String description) {
return JobBuilder.newJob().ofType(SimpleJob.class).storeDurably()
.withIdentity(JobKey.jobKey(identity))
.withDescription(description)
.build();
}
private SimpleTrigger trigger(JobDetail jobDetail) {
return TriggerBuilder.newTrigger().forJob(jobDetail)
.withIdentity(jobDetail.getKey().getName(), jobDetail.getKey().getGroup())
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1))
.build();
}
}
您可以控制所有的计划(暂停、停止、重新启动、删除等)从计划程序
查看文档
我使用Quartz调度器执行10个作业。所有这些工作都有自己的导火索。因此它们是异步执行的。 然而,现在我需要这些工作中的2个,以更具体的方式执行。假设Job1每偶数分钟执行一次,Job2每奇数分钟执行一次。现在我想让Job2等待Job1完成。示例:Job1在10:02开始执行。10点03分,Job2的触发器被触发。但是在Job2开始执行之前,如果Job1已经完成,它将查看它。 你知道我怎么解决问
我是新的spring批处理框架和石英调度器。我的任务是使用quartz调度器动态调度一个新的spring批处理作业。所有新的spring批处理作业的条目都在我的数据库中,具有触发器表达式。问题是,对于每一个来自数据库的新的spring批处理作业,我们需要将其包装在Quartz的调度器作业中。这就意味着,当有许多spring批处理作业时,就应该有许多批处理作业类来包装它们,并由quartz调度程序运
我希望使用Quartz调度器,以便应用程序的服务器部分使用调度器创建一个作业并将其存储在JDBCStore中,而UI部分(前端)使用调度器的另一个实例(指向相同的数据库模式)为该作业添加触发器。我以为UI知道作业和组的名称就足够了,因为添加触发器类似于: 不幸的是,这会为job类抛出异常。如有任何帮助,我们将不胜感激。谢谢你。
我只是设置QUARTZ用于我们的企业应用程序。下面的代码片段只是示例,并不是从实际的web应用程序中摘取的。 Quartz.Properties配置如下: 最后,我的quartz-config.xml:
我想使用Quartz和Oracle作为JobStore来安排作业。我看到了大多数使用RAMjobstore的示例(当然它不是持久的),但几乎没有任何一个可以帮助我满足Spring boot Quartz Oracle开发的需求。 如有任何指向代码示例或github项目的链接或帮助,将不胜感激。