Quartz作业调度基本使用详解
作者:石头耳东
Quartz核心概念
实际业务开发中会遇到定时任务的情形,这种时候可以使用Quartz来帮助我们便捷地完成。
① Job
Job表示一个工作(任务),需要执行的具体内容。开发中我们可以通过实现Job接口,来指定我们具体要执行的工作。不过也可以直接写一个类,Spring会帮助我们做具体的注入。
public interface Job { void execute(JobExecutionContext context) throws JobExecutionException; }
当然我们可以使用Spring配置将Job注入容器,如下:
<bean id="helloJob" class="com.example.jobs.HelloJob"/>
② JobDetail
JobDetail表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容。我们需要通过JobDetail来对Job进行绑定,具体如下:
JobDetail job = newJob(HelloJob.class) .withIdentity("helloJob", "group1") .build();
当然我们也可以通过配置Spring将其注入到应用容器当中,如下:
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 注入目标对象 --> <property name="targetObject" ref="helloJob"/> <!-- 注入目标方法 --> <property name="targetMethod" value="sayHello"/> </bean>
③ TriggerTrigger定义执行给定作业的计划的组件。
Trigger trigger = newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(simpleSchedule() .withIntervalInSeconds(40) .repeatForever()) .build();
在Spring配置中继续注册我们的触发器,如下:
<bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 注入JobDetail --> <property name="jobDetail" ref="jobDetail"/> <!-- 指定触发的时间,基于Cron表达式 --> <property name="cronExpression"> <!--<value>0 0 2 * * ?</value>--> <value>0/10 * * * * ?</value> </property> </bean>
④ SchedulerScheduler代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。
//注册trigger并启动scheduler scheduler.scheduleJob(job,trigger); scheduler.start();
在Spring中我们也使用对应的FactoryBean来完成注册,如下:
<!-- 注册一个统一的调度工厂,通过这个调度工厂调度任务 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 注入多个触发器 --> <property name="triggers"> <list> <ref bean="myTrigger"/> </list> </property> </bean>
Quartz结合Spring使用的一些细节
autoStartup自动启动
通过观察代码,我们不难发现在编码中我们手动去启动了scheduler,如下:
scheduler.start();
而在Spring中,我们使用了SchedulerFactoryBean,工厂Bean来完成scheduler对象的注入。我们并没有显示地去获取scheduler对象,和启动任务调度。
因为在Spring bean相应的生命周期内,框架已经帮我们完成了启动与调度。
(此处我们不讨论FactoryBean获取bean对象的相关细节,大家应该清楚FactoryBean会通过getObject()来返回我们相应的bean)
SchedulerFactoryBean自动启动任务调度的部分源码
通过查看源码,我们可以看到SchedulerFactoryBean的属性默认支持scheduler的自动启动。
我们也可以通过setAutoStartup()方法来禁用此选项。
private boolean autoStartup = true; /** * Set whether to automatically start the scheduler after initialization. * <p>Default is "true"; set this to "false" to allow for manual startup. */ public void setAutoStartup(boolean autoStartup) { this.autoStartup = autoStartup; }
JobDetail与Trigger
编码形式的JobDetail与Trigger其实没有直接绑定,理论上两者都可以复用。但是Spring的形式中因为我们使用了特定的FactoryBean,Trigger绑定了JobDetail,能够复用的仅有JobDetail。
总结
Quartz的功能其实相当强大,此案例只是使用了基本的功能,对于更深入的内容没有展开讨论,更多关于Quartz作业调度的资料请关注脚本之家其它相关文章!