利用timer,spring,quartz进行任务调度
1.利用JDK的java.util.timer java.util.timerTask实现简单的任务调度、
timerTask代表一个多次执行的任务,实现了runnable接口,可以在run()方法中定义业务逻辑。
timer负责制定调度规则并负责调度timerTask
public class Job extends TimerTask{
static int i = 0;
public void run() {
System.out.println("method一第"+i+++"次调度");
}
public static void main(String[] args) {
Timer timer = new Timer();
//设置执行延迟的时间
timer.schedule(new Job(), 5000);
//设置循环调度的时间间隔
timer.schedule(new Job(), 0,1000);
}
}
2.spring quartz框架集成实现任务调度
导入quartz-all-1.6.0.jar
使用corn触发器
//spring配置文件中的配置
<!-- 定义调度工厂,配置触发器 -->
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerBean"/>
</list>
</property>
<!--
<property name="autoStartup" value="true"></property>
<property name="schedulerName" value="cronScheduler" />
-->
</bean>
<!-- 定义触发器 -->
<bean id = "cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="cronExpression" value="* * * * * ? *"></property>
<!-- 通过该属性关联工作类 -->
<property name="jobDetail">
//方式1:通过反射的方式完成任务调度,执行目标对象的目标方法
<!--
<bean
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="concurrent">
<value>false</value>
</property>
<property name="targetObject" ref="job" />
<property name="targetMethod" value="run" />
</bean>
-->
//方式2:工作类必须实现QuartzJobBean接口,执行executeInternal方法
<bean class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.quartz.task.Job"></property>
//为工作类的属性赋值
<property name="jobDataAsMap">
<map>
<entry key = "name" value="kasim"></entry>
</map>
</property>
</bean>
</property>
</bean>
//创建一个工作,若使用反射完成任务调度,则不需要实现QuartzJobBean接口,复写executeInternal方法
<bean id="job" class="com.quartz.task.Job"></bean>
//工作类
class job{...}
3.cronExpression 触发器表达式
* * * * * ? * 表示每分每秒都会触发
| | | | | | |
秒分时日月周年
* 表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。
? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。
例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?