1. 根据配置文件 创建ScheduledTaskRegistrar 对象之后,
TaskScheduler taskScheduler 任务池 已有值;
Map<Runnable, String> cronTasks 计划任务map,key为任务对象,value为定时表达式
Set<ScheduledFuture<?>> scheduledFutures = new LinkedHashSet<ScheduledFuture<?>>(); 被创建
2.ScheduledTaskRegistrar.afterPropertiesSet()被执行
根据 cronTasks 创建 ScheduledFuture 放入 scheduledFutures 中
如下:
for (Map.Entry<Runnable, String> entry : this.cronTasks.entrySet()) {
this.scheduledFutures.add(this.taskScheduler.schedule(entry.getKey(), new CronTrigger(entry.getValue())));
}
(1)创建ScheduledFuture 是通过创建ReschedulingRunnable 对象调用对应的 schedule() 方法来完成。
(2)在 ReschedulingRunnable . schedule() 中,根据表达式计算当前任务下次执行时间,然后将this, 也就是ReschedulingRunnable对象本身,
交由 taskScheduler 任务池 去执行。
(3)任务池到时执行 ReschedulingRunnable 对象的run方法,记录开始执行的时间和 调用supper.run()后的结束时间,用这两个时间修改triggerContext;
因为 ReschedulingRunnable 对象在创建的时候,已将业务方法的执行代理,给了 supper的delegate属性,所以supper.run()执行的时候其实就是
执行 delegate.run() 方法,也就是执行业务方法;
ScheduledMethodRunnable 类只有两个属性,一个是业务对象,一个是要执行的方法;然后在run方法中就是用反射 执行业务对象的 对应方法而已。
获取一个类的方法对象 getClass().getMethod(methodName); 即可;
动态修改指定定时任务表达式,代码如下:
public class AuditDefectServiceTest {
public static void main(String[] args){
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("classpath:test-context.xml");
appContext.start();
try {
System.out.println("start..");
Thread.sleep(1000*4);
System.out.println("end...");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//appContext.refresh();
ScheduledTaskRegistrar s = appContext.getBean(ScheduledTaskRegistrar.class);
try {
Field f = s.getClass().getDeclaredField("scheduledFutures");
ReflectionUtils.makeAccessible(f);
Set<ScheduledFuture<?>> rt = (Set<ScheduledFuture<?>>) ReflectionUtils.getField(f, s);
for (ScheduledFuture<?> it : rt){
Field f2 = it.getClass().getDeclaredField("trigger");
ReflectionUtils.makeAccessible(f2);
CronTrigger trigger = (CronTrigger) ReflectionUtils.getField(f2, it);
Field f3 = trigger.getClass().getDeclaredField("sequenceGenerator");
ReflectionUtils.makeAccessible(f3);
ReflectionUtils.setField(f3, trigger, new CronSequenceGenerator("0/2 * * 5-29 * ?", TimeZone.getDefault()));
Method scheduleMethod = it.getClass().getDeclaredMethod("schedule");
ReflectionUtils.makeAccessible(scheduleMethod);
ReflectionUtils.invokeMethod(scheduleMethod, it);
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
分享到:
相关推荐
Spring定时任务的几种实现,欢迎交流!
Spring3.x企业应用开发实战 中 Spring 定时任务源码(spring 三种定时任务的实现方式),Spring quartz java 定时器 定时任务 源码
Spring提供的三种定时任务机制及其比较
spring spring spring spring定时任务所需jar 齐全
spring定时任务SimpleTrigger 和CronTrigger 配置
Spring定时任务调用配置Spring定时任务调用配置Spring定时任务调用配置Spring定时任务调用配置Spring定时任务调用配置
使用spring定时任务,使用spring+mybatis 向数据库中插入数据实例
spring 做定时器任务时所依赖的10个jar包,用于实现java定时任务。
一个tomcat下部署了两个应用,一个是普通web应用syncc,另一个应用syncc_wx属于微信公众号后台程序涉及消息定时推送,tomcat未分离...”spring定时任务执行两次的异常排查处理.docx"针对上述描述问题进行分析和解决。
spring 定时任务 示例代码
完整的javaspring定时任务的实现,通过配置数据库可以实现定时任务的修改,不必频繁的修改配置文件,大家可以自行在上面实现更多的定时任务管理。数据库表结构已经上传
实现定时任务的执行操作!
本代码实现利用Spring实现定时任务执行功能,用于非Web项目。
Spring 定时任务 各参数详细说明,注解方式,简洁
2.通过Spring是JAR-quartz写的一个定时任务 1)普通的定时任务,定时完成指定的任务 2)通过前台动态分配定时任务 可指定多个任务,可同时执行任务,可以精确到时分秒扫描并执行任务 3)可以完成稍微复杂点的任务 ...
通过配置文件来实现定时任务
spring定时任务 xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation=...
本案例实现利用Spring技术实现定时任务功能,用于Web项目