Quartz是一个功能丰富的开源作业调度库,可集成至Java ee/se中,使用该技术可创建简单或者复杂的执行计划,他支持数据库、集群、插件以及邮件,并支持cron表达式,具有很高的灵活性。在Quartz中主要提供三个Bean:JobDetail、Trigger以及SchedulerFactory。
- 配置pom.xml依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
- 创建两个Job
@Component public class MyFirstJob { //普通的bean需要添加Component使用容器注入 public void sayHello(){ System.out.println("MyFirstJob:sayHello:"+new Date()); } }
在集成了QuartzJobBean的Job的时候,需要创建QuartzConfig对JobDetail和Trigger进行配置。
public class MySecondJob extends QuartzJobBean { private String name; public void setName(String name) { this.name = name; } //继承了QuartzJobBean的bean需要实现executeInternal方法 //该方法在被调用时使用 @Override protected void executeInternal(JobExecutionContext context){ System.out.println("Hello:"+name+":"+new Date()); } }
@Configuration public class QuartzConfig { @Bean MethodInvokingJobDetailFactoryBean jobDetailFactoryBean1(){ //这是第一种JobDetail的配置方式,只需要指定Job的实例名以及调用方法即可 //但是无法在创建JobDetail时传递参数 MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean(); bean.setTargetBeanName("myFirstJob"); bean.setTargetMethod("sayHello"); return bean; } @Bean JobDetailFactoryBean jobDetailFactoryBean2(){ //通过JobDetailFactoryBean实现的需要指定JobClass可通过Map导入参数 JobDetailFactoryBean bean = new JobDetailFactoryBean(); bean.setJobClass(MySecondJob.class); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("name","sang"); bean.setJobDataMap(jobDataMap); bean.setDurability(true); return bean; } @Bean SimpleTriggerFactoryBean simpleTriggerFactoryBean(){ //使用SimpleTriggerFactoryBean创建 SimpleTriggerFactoryBean simpleTriggerFactoryBean = new SimpleTriggerFactoryBean(); //首先设置JobDetail simpleTriggerFactoryBean.setJobDetail(jobDetailFactoryBean1().getObject()); //其次配置任务次数 simpleTriggerFactoryBean.setRepeatCount(3); //然后配置任务启动延时时间 simpleTriggerFactoryBean.setStartDelay(1000); //最后配置任务的时间间隔 simpleTriggerFactoryBean.setRepeatInterval(2000); return simpleTriggerFactoryBean; } @Bean CronTriggerFactoryBean cronTriggerFactoryBean(){ //在CronTriggerFactoryBean中主要配置JobDetail和CronExpression CronTriggerFactoryBean bean = new CronTriggerFactoryBean(); bean.setJobDetail(jobDetailFactoryBean2().getObject()); bean.setCronExpression("* * * * * ?"); return bean; } @Bean SchedulerFactoryBean schedulerFactory(){ //通过SchedulerFactoryBean创建SchedulerFactory SchedulerFactoryBean bean = new SchedulerFactoryBean(); SimpleTrigger simpleTrigger = simpleTriggerFactoryBean().getObject(); CronTrigger cronTrigger = cronTriggerFactoryBean().getObject(); //setTriggers中参数为Trigger的class bean.setTriggers(simpleTrigger,cronTrigger); return bean; } }
执行结果:
Hello:sang:Sun Apr 07 14:56:57 CST 2019 Hello:sang:Sun Apr 07 14:56:58 CST 2019 MyFirstJob:sayHello:Sun Apr 07 14:56:58 CST 2019 Hello:sang:Sun Apr 07 14:56:59 CST 2019 Hello:sang:Sun Apr 07 14:57:00 CST 2019 MyFirstJob:sayHello:Sun Apr 07 14:57:00 CST 2019 Hello:sang:Sun Apr 07 14:57:01 CST 2019 Hello:sang:Sun Apr 07 14:57:02 CST 2019 MyFirstJob:sayHello:Sun Apr 07 14:57:02 CST 2019 Hello:sang:Sun Apr 07 14:57:03 CST 2019 Hello:sang:Sun Apr 07 14:57:04 CST 2019 MyFirstJob:sayHello:Sun Apr 07 14:57:04 CST 2019 Hello:sang:Sun Apr 07 14:57:05 CST 2019 Hello:sang:Sun Apr 07 14:57:06 CST 2019 Hello:sang:Sun Apr 07 14:57:07 CST 2019 Hello:sang:Sun Apr 07 14:57:08 CST 2019 Hello:sang:Sun Apr 07 14:57:09 CST 2019 Hello:sang:Sun Apr 07 14:57:10 CST 2019