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定时任务的几种实现,欢迎交流!
其中,Spring的定时任务功能是许多项目中的重要组成部分,它允许开发者安排和执行周期性的任务。本文将详细探讨Spring定时任务的关键知识点,并与提供的jar包列表关联。 首先,Spring定时任务主要依赖于`spring-...
对于更高级的监控需求,可以考虑集成如Spring Boot Actuator等工具,或者使用专门的日志服务来跟踪和分析定时任务的执行情况。 综上所述,Spring提供的定时任务功能使得开发者能够轻松地在非Web项目中实现复杂的...
在Java开发中,Spring框架以其强大的功能和灵活性深受开发者喜爱,其中包括了对定时任务的支持。在Spring中,我们可以使用Spring的TaskExecution和TaskScheduling模块来实现定时任务,这些功能通常依赖于特定的jar包...
下面将详细讲解这三种定时任务的实现方式及其源码分析。 1. **基于TaskExecutor的定时任务** TaskExecutor接口是Spring提供的一个异步任务执行接口,它并不直接支持定时任务,但可以通过配合...
Spring框架提供了多种方式来实现定时任务,这使得开发者可以在不同场景下选择最适合的方案。本文主要探讨了Spring中实现定时任务的三种主要方法:Java的`java.util.Timer`、Quartz库以及Spring自身的Task调度器。 ...
Spring定时任务是Spring框架中的一个强大特性,它允许开发者在应用程序中设置定时任务,以便在预定义的时间间隔执行特定的任务。这个功能对于实现自动化、批处理、数据同步、监控等多种业务场景非常有用。在本篇中,...
通常,我们会在配置类中使用`@EnableScheduling`注解来开启定时任务,然后通过`@Scheduled`注解来定义具体的任务及其执行计划。 总的来说,Spring的定时任务功能强大且易于使用,通过合理的配置和jar包的集成,我们...
在Web开发中,有时我们需要执行一些周期性的任务,如数据清理、统计分析或者发送通知等。Spring框架提供了强大的定时任务支持,使得在Web项目中实现这类功能变得简单易行。本案例将详细介绍如何利用Spring技术来实现...
在Spring框架中,定时任务是实现自动化操作的重要组成部分,它允许开发者在特定的时间间隔执行一些重复性的任务。本文将深入探讨Spring中的定时任务,并结合Eclipse和Maven项目环境进行讲解。 首先,Spring提供了两...
在Spring框架中,有三种主要的定时任务机制可供开发者选择,分别是基于Quartz的定时机制、Spring自己的`@Scheduled`注解以及Java的`java.util.Timer`类。在这篇文章中,我们将重点讨论基于Quartz的定时机制,因为它...
在Spring框架中,定时任务是实现应用程序自动化执行特定任务的关键特性。这个例子将带你了解如何在Spring中设置和使用简单的定时任务。首先,我们需要引入Spring的Task模块,它提供了对定时任务的支持。 1. **引入...
在Spring框架中,XML配置是传统且广泛使用的方式来设置应用的组件和行为,包括实现定时任务。定时任务在软件开发中扮演着重要角色,它允许应用程序在预设的时间执行特定的任务,例如数据清理、日志归档或者发送通知...
一个tomcat下部署了两个应用,一个是普通web应用syncc,另一个应用syncc_wx属于微信公众号后台程序涉及消息定时推送,tomcat未分离...”spring定时任务执行两次的异常排查处理.docx"针对上述描述问题进行分析和解决。
spring定时任务SimpleTrigger 和CronTrigger 配置
通过理解并实践这个示例,你可以更好地掌握Spring定时任务的使用,将其应用到实际的项目开发中,实现自动化任务,如数据备份、统计分析等。记得在生产环境中考虑任务的并发性和资源管理,以确保系统的稳定性和性能。
在Spring框架中,定时任务是实现自动化操作的重要组成部分,它允许开发者在预设的时间间隔执行特定的任务。`@Scheduled`注解是Spring提供的一个强大工具,用于声明式地配置定时任务,无需编写复杂的线程管理和调度...
在Java Spring框架中,动态配置定时任务是一项非常实用的功能,它允许我们根据需求灵活地更改或添加定时任务,而无需每次改动都重启应用。本文将深入探讨如何在Spring中实现这种动态配置,以及如何结合数据库来管理...
本文将重点介绍如何利用Spring框架结合表达式规则来配置和执行定时任务,这些规则与Linux中的crontab规则非常相似。 #### 一、定时任务表达式解析 定时任务表达式是一种用于定义何时执行定时任务的标准格式,它由...