Spring通过quartz框架可以进行任务调度。
要在spring 中利用quartz调度任务;需要配置三个bean:
1、 jobDetail 任务详细信息;包括调用哪个类;类中的哪个方法;执行时是否可并行执行任务。
2、 trigger 任务调度触发器;主要用于定义jobDetail什么时候执行。触发器最常用的有两种:简单触发器SimpleTrigger 和 任务触发器CronTrigger 。SimpleTrigger和jdk的timer类似,只能指定任务执行以什么样的频率执行,但无法制定精确的执行时间。CronTrigger则既可以执行简单触发器所制定的以频率来执行的时间,也可以制定复杂的时间计划来执行。如可制定:每个月的最后一天的15点来执行相关任务。
3、 schedulerFactory 任务调度工厂;用于调度各个任务触发器。
例子1、
public void doSimpleTriggerTask() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("doing simpleTrigger task..." + sdf.format(new Date()));
}
public void doCronTriggerTask() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("doing cronTrigger task..." + sdf.format(new Date()));
}
<!-- 注册一个普通bean -->
<bean id="quartzTask" class="cn.itcast.nsfw.complain.QuartzTask"></bean>
<!-- 1、制定任务信息信息 -->
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 设置执行对象 -->
<property name="targetObject" ref="quartzTask"></property>
<!-- 设置执行对象中对应的执行方法 -->
<property name="targetMethod" value="doSimpleTriggerTask"></property>
<!-- 是否可以同步执行;不可同步执行 -->
<property name="concurrent" value="false"></property>
</bean>
<bean id="jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 设置执行对象 -->
<property name="targetObject" ref="quartzTask"></property>
<!-- 设置执行对象中对应的执行方法 -->
<property name="targetMethod" value="doCronTriggerTask"></property>
<!-- 是否可以同步执行;不可同步执行 -->
<property name="concurrent" value="false"></property>
</bean>
<!-- 2、制定任务执行时机(任务执行触发器) -->
<bean id="simplerTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<!-- 设置任务详细 -->
<property name="jobDetail" ref="jobDetail1"></property>
<!-- 设置任务延迟执行时间 ;延迟2秒执行-->
<property name="startDelay" value="2000"></property>
<!-- 设置任务执行频率;执行频率为每4秒执行一下 -->
<property name="repeatInterval" value="2000"></property>
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- 设置任务详细 -->
<property name="jobDetail" ref="jobDetail2"></property>
<!-- 设置任务执行时机,cron表达式 -->
<property name="cronExpression" value="0/3 * * * ?"></property>
</bean>
<!-- 3、设置调度工厂 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!-- <ref bean="simplerTrigger"/> -->
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
例子2、
@Override
public void autoDeal() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 1);//设置当前时间的日期为1号
cal.set(Calendar.HOUR_OF_DAY, 0);//设置当前时间的日期为1号,0时
cal.set(Calendar.MINUTE, 0);//设置当前时间的日期为1号,0分
cal.set(Calendar.SECOND, 0);//设置当前时间的日期为1号,0秒
//1、查询本月之前的待受理的投诉列表
QueryHelper queryHelper = new QueryHelper(Complain.class, "c");
queryHelper.addCondition("c.state=?", Complain.COMPLAIN_STATE_UNDONE);
queryHelper.addCondition("c.compTime < ?", cal.getTime());//本月1号0时0分0秒
List<Complain> list = findObjects(queryHelper);
if(list != null && list.size() > 0){
//2、更新投诉信息的状态为 已失效
for(Complain comp: list){
comp.setState(Complain.COMPLAIN_STATE_INVALID);
complainDao.update(comp);
}
}
}
<!--1、 制定任务信息 -->
<bean id="complianJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 设置执行对象 -->
<property name="targetObject" ref="complainService"></property>
<!-- 设置执行对象中的执行方法 -->
<property name="targetMethod" value="autoDeal"></property>
<!-- 设置是否可以同步,不可以同步执行 -->
<property name="concurrent" value="false"></property>
</bean>
<!-- 2、制定任务执行时机(任务执行触发器) -->
<bean id="complainCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- 设置任务详细信息 -->
<property name="jobDetail" ref="complianJobDetail"></property>
<!-- 设置任务执行的时间,cronExpression为每月最后一日的下午21点的每分的10秒执行任务 -->
<property name="cronExpression" value="10 * 21 L * ?"></property>
</bean>
<!-- 3、设置调度工厂 -->
<bean id="complainScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<ref bean="complainCronTrigger"/>
</property>
</bean>