笔记
Spring 为简化 Quartz 的操作提供了相关支持类Quartz Scheduler 。方便我们进行任务调度的开发。网上版本大都一大抄,而且时间久远,无奈去看官方文档,还好Google翻译很给力,钻研了一下午,搞定~配置了两个定时任务,一个是直接调用方法不需要继承任何类的简单任务,另一个是功能增强的继承QuartzJobBean的定时任务,可以满足一般需求了。
jar包准备
<!--Quartz核心库-->
quartz-2.2.3.jar
<!--日志记录,至少需要使用sl4j-api.jar文件,不然会报错-->
log4j-1.2.16.jar
log4j-core-2.8.2.jar
log4j-api-2.8.2.jar
slf4j-api-1.7.7.jar
<!--如果log4j实现了slf4j,那么需要加个转换器,不然Quartz报错信息可能会看不到-->
slf4j-log4j12-1.7.7.jar
<!--Spring jar包-->
spring-core-4.3.10.jar
spring-context-support-4.3.10.jar
spring-context-4.3.10.jar
核心Spring配置文件
<!--使用简单作业详情-->
<bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--配置简单作业的目标类-->
<property name="targetObject" ref="mySimpleJob"/>
<!--配置简单作业的目标方法-->
<property name="targetMethod" value="execute"/>
<!--false表示等上一个任务执行完后再开启新的任务-->
<property name="concurrent" value="false"/>
</bean>
<!--使用定时作业详情-->
<bean id="cronJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!--配置简单作业的目标类-->
<property name="jobClass" value="com.cheng.utils.quartz.MyCronJob"/>
<!--配置耐久性,如果一个任务不是durable,那么当没有Trigger关联它的时候,它就会被自动删除-->
<property name="durability" value="true"/>
</bean>
<!--配置简单触发器-->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="simpleJobDetail"/>
<!-- 延迟3s执行 -->
<property name="startDelay" value="3000"/>
<!-- 每隔10s执行一次 -->
<property name="repeatInterval" value="10000"/>
</bean>
<!--配置定时触发器-->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="cronJobDetail"/>
<!--每隔5s执行一次-->
<property name="cronExpression" value="*/5 * * * * ?"/>
</bean>
<!--配置调度器工厂-->
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!--配置触发器-->
<property name="triggers">
<list>
<ref bean="simpleTrigger"/>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
任务详情类
/**
* 定时任务
*/
public class MyCronJob extends QuartzJobBean {
private static int times = 0;
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String time = sdf.format(new Date());
System.out.println("【" + time + "】定时任务第【" + ++times + "】次执行……");
}
}
/**
* 简单任务
*/
@Component("mySimpleJob")
public class MySimpleJob {
private static int times = 0;
public void execute() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String time = sdf.format(new Date());
System.out.println("【" + time + "】简单任务第【" + ++times + "】次执行……");
}
}