Quartz:
Quartz调度包的两个基本单元是作业(Job)和触发器(Trigger)。作业是能够调度的可执行任务,触发器提供了对作业的调度。虽然这两个实体很容易合在一起,但在Quartz中将它们分离开来是有原因的,而且也很有益处。通过把要执行的工作与它的调度分开,Quartz允许在不丢失作业本身或作业的上下文的情况下,修改调度触发器。而且,任何单个的作业都可以有多个触发器与其关联
使用Spring集成Quartz: 本系统使用Spring来集成Quartz。我们只需要在Spring中配置相应的Trigger和Job,而不需要编写任何Java代码,Spring在找到这些bean后会自动启动这些Job。
Spring配置: <bean id="dumbJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="group " value="dumb "/>
<property name="jobClass " value="example.DumbJob "/>
<property name="name" value="dumbJob "/>
</bean>
<bean id="settlementJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="settlementBizFacade"/>
<property name="targetMethod" value="doSettlement"/>
<property name="concurrent" value="false"/>
<property name="name" value="settlement"/>
</bean> <bean id="settlementTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="settlementJob"/>
<!-- run at 23:55 everyday -->
<property name="cronExpression" value="0 55 23 * * ?"/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list> <ref bean="settlementTrigger"/>
</list> </property> <property name="quartzProperties">
<map> <!-- 1 job thread, change this if more jobs added -->
<entry key="org.quartz.threadPool.threadCount" value="1"/>
</map>
</property>
</bean>
首先我们需要配置一个Job,这里有两种方式:一种是为Job创建一个独立的JobClass,然后使用Spring的JobDetailBean配置该Job;另一种是使用MethodInvokingJobDetailFactoryBean指定一个方法,不需要一个单独的JobClass,它需要设置“targetObject”和“targetMethod”,则Trigger触发该Job的时候,目标方法会被调用。这里把“concurrent”设置为“false”,这被调用的方法不会在新线程里运行,而是顺序执行。 接下来我们配置了一个名为“settlementTrigger”的Cron触发器,它定义了settlementJob合适被调用。 最后需要配置的是SchedulerFactoryBean,它负责调度所有的trigger,还可以配置Quartz。因为当前的任务间隔较远,没有频繁执行的要求,所以这里把Quartz的线程数设为“1”