集成任务调度服务

JDK中任务调度核心是Timer类的schedule方法,传递一个继承TimerTask实现了run方法的类。
在Spring的xml文件中配置
  <!-- 单一任务 -->
<bean id="reportTask" class="example.chapter9.ReportTimerTask" />

<!-- 周期性任务 -->
<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!-- 启动后等待10秒,然后开始执行 -->
<property name="delay" value="10000" />
<!-- 每60秒执行一次 -->
<property name="period" value="60000" />
<property name="timerTask" ref="reportTask" />
</bean>

<!-- 启动任务的工厂 -->
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledTask" />
</list>
</property>
</bean>

<!-- 另一中建立任务的方法,reportTask不用继承TimerTask -->
<bean id="scheduledTaskInvoke" class="
org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="reportTask"/>
<property name="targetMethod" value="run"/>
</bean>


[b]
使用Quartz调度任务[/b]
Quartz中的几个概念
Job:定义一个任务,Job只管执行,不管什么时间执行,不管执行多少次
Trigger:定义一个出发器,表示何时触发一个Job执行,一个Job可以和多个Trigger关联
Scheduler:真正调度任务的调度器,通过scheduler(Job, Trigger)方法把关联了Tragger的Job放入调度器中执行
public class SimpleQuartz {
public static void main(String[] args) throws SchedulerException {
SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.start();
// 定义任务
JobDetail jobDetail = new JobDetail("myJob", null, AJob.class);
// 每3秒一次
Trigger trigger = TriggerUtils.makeSecondlyTrigger(3);
// 开始时间
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
trigger.setName("myTrigger");
scheduler.scheduleJob(jobDetail, trigger);
}
}
public class AJob implements Job{
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("xxxx");
}
}


Spring提供两种方式来封装Quartz的Job,一种是直接派生自QuartzJobBean,
public class Report extends QuartzJobBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Send report to " + name + " at " + new Date());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

在xml配置文件中将Report包装为JobDetailBean
  <bean name="reportJob" 
class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="example.chapter9.Report" />
<property name="jobDataAsMap">
<map>
<entry key="name" value="Micheal" />
</map>
</property>
</bean>

Spring会自动将jobDataAsMap属性中注入的Map按照Key注入到Report对象

另一种方式是POJO实现,
public class CheckDiskFreeSpace {
public void check() {
// get disk free space:
long freeSpace = Math.random() > 0.5 ? 100000000 : 200000000;
System.out.println("Check disk free space at " + new Date());
if (freeSpace < 100 * 1024 * 1024) { // <100MB
System.out.println("Warning! Low disk free space...");
}
}
}

  <bean name="checkDiskFreeSpace" class="example.chapter9.CheckDiskFreeSpace" />
<bean name="checkDiskJob" class="
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="checkDiskFreeSpace" />
<property name="targetMethod" value="check" />
<!-- 能否同时有多个Job执行 -->
<property name="concurrent" value="false" />
</bean>



下一步是定地Trigger,
Spring封装了两种常用的TriggerBean,一种是SimpleTriggerBean,可以周期性执行Job
<!-- 周期性运行checkDiskJob -->
<bean id="repeatTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="checkDiskJob" />
<!-- 1分钟后启动 -->
<property name="startDelay" value="60000" />
<!-- 5分钟检查一次 -->
<property name="repeatInterval" value="300000" />
</bean>

另一种是CronTriggerBean功能更强大,能指定何时执行Job
<!-- 定时运行reportJob -->
<bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="reportJob" />
<!-- 每周周一至周五中午12:00执行 -->
<property name="cronExpression" value="0 0 12 ? * MON-FRI" />
</bean>


cronExpression表达式
字段 	  	允许值 	  	允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /



最后只需启动Scheduler
  <bean id="scheduler" 
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="repeatTrigger" />
<ref bean="cronTrigger" />
</list>
</property>
</bean>



附表:
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

至于每个符号 看看例子就好了.很简单了.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值