001-spring结合quartz使用
一、添加pom
二、定义业务类
public class TestJobTask{ /** *业务逻辑处理 */ public void service(){ /**业务逻辑*/ .. } }
二、配置spring的xml
<!-- 线程执行器配置,用于任务注册 --> <bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="10"/> <property name="maxPoolSize" value="100"/> <property name="queueCapacity" value="500"/> </bean> <!-- 业务对象 --> <bean id="testJobTask" class="com.mike.scheduling.TestJobTask"/> <!-- 调度业务 --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="testJobTask"/> <property name="targetMethod" value="service"/> </bean> <!-- 第一种触发时间,采用类似linux的cron,配置时间的表示发出丰富--> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="jobDetail"/> <!--Cron表达式“10 */1 * * * ?”意为:从10秒开始,每1分钟执行一次 --> <property name="cronExpression" value="10 0/1 * * * ?"/> </bean> <!-- 第二种,采用比较简话的方式,申明延迟时间和间隔时间--> <bean id="taskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <!--延迟10秒启动,然后每隔1分钟执行一次 --> <property name="jobDetail" ref="jobDetail"/> <property name="startDelay" value="10000"/> <property name="repeatInterval" value="60000"/> </bean> <!-- 设置调度 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> <property name="taskExecutor" ref="executor"/> </bean>
启动容器即可,已经将spring和quartz结合完毕
根据上面spring的配置,我们就比较清楚quartz的内部情况,下面我们主要详解配置涉及到的每个点
1.我们先从最后一个步骤看起, SchedulerFactoryBean ,scheduler的工厂实现,里面可以生产出对应的多个jobDetail和trigger,每个jobDetail对应trigger代表一个任务
Quartz的SchedulerFactory是标准的工厂类,不太适合在Spring环境下使用。此外,为了保证Scheduler能够感知 Spring容器的生命周期,完成自动启动和关闭的操作,必须让Scheduler和Spring容器的生命周期相关联。以便在Spring容器启动后, Scheduler自动开始工作,而在Spring容器关闭前,自动关闭Scheduler。为此,Spring提供 SchedulerFactoryBean,这个FactoryBean大致拥有以下的功能:
1)以更具Bean风格的方式为Scheduler提供配置信息;
2)让Scheduler和Spring容器的生命周期建立关联,相生相息;
3)通过属性配置部分或全部代替Quartz自身的配置文件。
2.jobDetail,表示一个可执行的业务调用
3.trigger:调度的时间计划,什么时候,每隔多少时间可执行等时间计划
4. ThreadPoolTaskExecutor,线程池,用来并行执行每个对应的job,提高效率,这也是上面提到不推荐使用jdk自身timer的一个很重要的原因