完成定时器的三个对象:
定时器对象:Scheduler;
触发条件对象:Trigger;
工作对象:JobDertail;
步骤如下:
第一步:导包
<!-- quartz定时器 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
第二步:创建定时器对象Scheduler
Scheduler scheduler=StdSchedulerFactory.getDefaultScheduler();
第三步:创建工作对象JobDetail
JobDetail job=JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group").build();
第四步:创建触发条件对象:Trigger
触发条件对象分为简易条件对象和复杂条件对象;
简易条件对象就是根据秒数时间来触发执行操作,
复杂条件对象就是根据日历时间来触发执行操作。
对象 TriggerBuilder 启动任务时间
startNow 立即启动
startAt (Date) 指定时间启动
对象 SimpleScheduleBuilder 进行简单任务重复执行
repeatSecondly …() 多少秒后重复执行
repeatminutely …() 多少分钟后重复执行
repeatHourly …() 多少小时后重复执行
Trigger trigger=TriggerBuilder.newTrigger().withIdentity("trigger1", "group").startNow() .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(3)).build();
第五步:定时器业务执行
scheduler.scheduleJob(job, trigger);
scheduler.start();
一般我们整合Spring和Quartz使用
在applicationContext.xml中配置:
<!-- job 工作对象 -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 注意:此处需要的是工作类的类对象,即class.forName("PromotionJob") -->
<!-- XX.getClass跟class.forName(XX)不一样 -->
<!-- 必须用value,不可以用ref,JobDetail只支持和识别value -->
<!-- value里面写工作类的全路径 -->
<property name="jobClass" value="cn.itcast.bos.service.quartz.PromotionJob" />
</bean>
<!-- simpleTrigger触发器 -->
<bean id="simpleTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail" />
<!-- 3秒后第一次执行 -->
<property name="startDelay" value="3000" />
<!-- 5秒后重复执行 -->
<property name="repeatInterval" value="5000" />
</bean>
<!-- cronTrigger触发器 -->
<bean id="cronTrigger" class="org.quartz.CronTrigger">
<property name="jobDetail" ref="jobDetail"></property>
<!-- 每日6时触发 -->
<!-- day-of-month 和 day-of-week 只能设置一个值,另一个值写 ? -->
<property name="cronExpression" value="0 0 6 * * ?"></property>
</bean>
<!-- scheduler 定时器对象 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 当我们需要给工作类注入service类时,需要下面的jobFactory -->
<property name="jobFactory" ref="jobFactory" />
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
<ref bean="simpleTrigger"/>
</list>
</property>
</bean>
问题: 在 Job 中 spring 管理的 Bean 无法注入
解决: 需要在 Scheduler 中自定义 JobFactory
@Service("jobFactory")
public class JobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle)
throws Exception {
Object jobInstance = super.createJobInstance(bundle);
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
注意:添加@Service注解是让工作类处于Spring的管理下
工作类,即需要定时执行的业务:PromotionJob