`
chongquanyumo
  • 浏览: 31094 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

spring定时任务分析,及其线上实时修改表达式

阅读更多
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();
		}
		
	}
}
分享到:
评论
1 楼 sxshunrj 2016-10-18  
按照你的代码写了一下,一直报找不到字段是为啥呢?
java.lang.NoSuchFieldException: scheduledFutures
at java.lang.Class.getDeclaredField(Class.java:1953)
跟jdk版本有关系吗?请大师指导一下

相关推荐

    Spring定时任务管理

    Spring定时任务的几种实现,欢迎交流!

    spring定时任务关键jar包(齐全)

    其中,Spring的定时任务功能是许多项目中的重要组成部分,它允许开发者安排和执行周期性的任务。本文将详细探讨Spring定时任务的关键知识点,并与提供的jar包列表关联。 首先,Spring定时任务主要依赖于`spring-...

    Spring定时任务实现(非Web项目)

    对于更高级的监控需求,可以考虑集成如Spring Boot Actuator等工具,或者使用专门的日志服务来跟踪和分析定时任务的执行情况。 综上所述,Spring提供的定时任务功能使得开发者能够轻松地在非Web项目中实现复杂的...

    spring定时任务依赖的jar包

    在Java开发中,Spring框架以其强大的功能和灵活性深受开发者喜爱,其中包括了对定时任务的支持。在Spring中,我们可以使用Spring的TaskExecution和TaskScheduling模块来实现定时任务,这些功能通常依赖于特定的jar包...

    Spring 定时任务源码(spring 三种定时任务的实现方式)

    下面将详细讲解这三种定时任务的实现方式及其源码分析。 1. **基于TaskExecutor的定时任务** TaskExecutor接口是Spring提供的一个异步任务执行接口,它并不直接支持定时任务,但可以通过配合...

    spring定时任务实现

    Spring框架提供了多种方式来实现定时任务,这使得开发者可以在不同场景下选择最适合的方案。本文主要探讨了Spring中实现定时任务的三种主要方法:Java的`java.util.Timer`、Quartz库以及Spring自身的Task调度器。 ...

    Spring定时任务

    Spring定时任务是Spring框架中的一个强大特性,它允许开发者在应用程序中设置定时任务,以便在预定义的时间间隔执行特定的任务。这个功能对于实现自动化、批处理、数据同步、监控等多种业务场景非常有用。在本篇中,...

    spring定时任务所需jar

    通常,我们会在配置类中使用`@EnableScheduling`注解来开启定时任务,然后通过`@Scheduled`注解来定义具体的任务及其执行计划。 总的来说,Spring的定时任务功能强大且易于使用,通过合理的配置和jar包的集成,我们...

    Spring定时任务(Web项目)

    在Web开发中,有时我们需要执行一些周期性的任务,如数据清理、统计分析或者发送通知等。Spring框架提供了强大的定时任务支持,使得在Web项目中实现这类功能变得简单易行。本案例将详细介绍如何利用Spring技术来实现...

    Spring中定时任务

    在Spring框架中,定时任务是实现自动化操作的重要组成部分,它允许开发者在特定的时间间隔执行一些重复性的任务。本文将深入探讨Spring中的定时任务,并结合Eclipse和Maven项目环境进行讲解。 首先,Spring提供了两...

    Spring提供的三种定时任务机制及其比较

    在Spring框架中,有三种主要的定时任务机制可供开发者选择,分别是基于Quartz的定时机制、Spring自己的`@Scheduled`注解以及Java的`java.util.Timer`类。在这篇文章中,我们将重点讨论基于Quartz的定时机制,因为它...

    Spring定时任务的简单例子

    在Spring框架中,定时任务是实现应用程序自动化执行特定任务的关键特性。这个例子将带你了解如何在Spring中设置和使用简单的定时任务。首先,我们需要引入Spring的Task模块,它提供了对定时任务的支持。 1. **引入...

    spring xml 定时任务

    在Spring框架中,XML配置是传统且广泛使用的方式来设置应用的组件和行为,包括实现定时任务。定时任务在软件开发中扮演着重要角色,它允许应用程序在预设的时间执行特定的任务,例如数据清理、日志归档或者发送通知...

    spring定时任务执行两次的异常排查处理

    一个tomcat下部署了两个应用,一个是普通web应用syncc,另一个应用syncc_wx属于微信公众号后台程序涉及消息定时推送,tomcat未分离...”spring定时任务执行两次的异常排查处理.docx"针对上述描述问题进行分析和解决。

    spring定时任务配置

    spring定时任务SimpleTrigger 和CronTrigger 配置

    spring定时任务demo包含jar包

    通过理解并实践这个示例,你可以更好地掌握Spring定时任务的使用,将其应用到实际的项目开发中,实现自动化任务,如数据备份、统计分析等。记得在生产环境中考虑任务的并发性和资源管理,以确保系统的稳定性和性能。

    Spring定时任务@Scheduled例子

    在Spring框架中,定时任务是实现自动化操作的重要组成部分,它允许开发者在预设的时间间隔执行特定的任务。`@Scheduled`注解是Spring提供的一个强大工具,用于声明式地配置定时任务,无需编写复杂的线程管理和调度...

    spring动态配置定时任务

    在Java Spring框架中,动态配置定时任务是一项非常实用的功能,它允许我们根据需求灵活地更改或添加定时任务,而无需每次改动都重启应用。本文将深入探讨如何在Spring中实现这种动态配置,以及如何结合数据库来管理...

    spring执行定时任务的规则

    本文将重点介绍如何利用Spring框架结合表达式规则来配置和执行定时任务,这些规则与Linux中的crontab规则非常相似。 #### 一、定时任务表达式解析 定时任务表达式是一种用于定义何时执行定时任务的标准格式,它由...

Global site tag (gtag.js) - Google Analytics