Spring在schedule这块支持JDK Timer、concurrent、quartz三种,这三种任务调度方案在实现机制和调用方法上都不同,但spring通过对其包装,使得基于spring能用统一的配置和编码风格来使用这三种schedule方案。
总得来说这三种schedule都是基于scheduler->trigger->job的基本流程,因此spring通过TimerFactoryBean、ScheduledExecutorFactoryBean和SchedulerFactoryBean分别实现JDK Timer、concurrent和quartz的基本流程。主要逻辑如下代码所示:
TimerFactoryBean
view plaincopy to clipboardprint?
public void afterPropertiesSet() {
logger.info("Initializing Timer");
this.timer = createTimer(this.beanName, this.daemon);
// Register specified ScheduledTimerTasks, if necessary.
if (!ObjectUtils.isEmpty(this.scheduledTimerTasks)) {
//注册task和timer registerTasks(this.scheduledTimerTasks, this.timer);
}
}
public void afterPropertiesSet() {
logger.info("Initializing Timer");
this.timer = createTimer(this.beanName, this.daemon);
// Register specified ScheduledTimerTasks, if necessary.
if (!ObjectUtils.isEmpty(this.scheduledTimerTasks)) {
//注册task和timer registerTasks(this.scheduledTimerTasks, this.timer);
}
}
ScheduledExecutorFactoryBean
view plaincopy to clipboardprint?
public void afterPropertiesSet() {
if (logger.isInfoEnabled()) {
logger.info("Initializing ScheduledExecutorService" +
(this.beanName != null ? " '" + this.beanName + "'" : ""));
}
ScheduledExecutorService executor =
createExecutor(this.poolSize, this.threadFactory, this.rejectedExecutionHandler);
// Register specified ScheduledExecutorTasks, if necessary.
if (!ObjectUtils.isEmpty(this.scheduledExecutorTasks)) {
registerTasks(this.scheduledExecutorTasks, executor);
}
// Wrap executor with an unconfigurable decorator.
this.executor = (this.exposeUnconfigurableExecutor ?
Executors.unconfigurableScheduledExecutorService(executor) : executor);
}
public void afterPropertiesSet() {
if (logger.isInfoEnabled()) {
logger.info("Initializing ScheduledExecutorService" +
(this.beanName != null ? " '" + this.beanName + "'" : ""));
}
ScheduledExecutorService executor =
createExecutor(this.poolSize, this.threadFactory, this.rejectedExecutionHandler);
// Register specified ScheduledExecutorTasks, if necessary.
if (!ObjectUtils.isEmpty(this.scheduledExecutorTasks)) {
registerTasks(this.scheduledExecutorTasks, executor);
}
// Wrap executor with an unconfigurable decorator.
this.executor = (this.exposeUnconfigurableExecutor ?
Executors.unconfigurableScheduledExecutorService(executor) : executor);
}
SchedulerFactoryBean
view plaincopy to clipboardprint?
public void afterPropertiesSet() throws Exception {
.....
// 初始化sceduler
initSchedulerFactory(schedulerFactory);
this.scheduler = createScheduler(schedulerFactory, this.schedulerName);
//注册listener、trigger和job
registerListeners();
registerJobsAndTriggers();
......
//启动scheduler
startScheduler(this.scheduler, this.startupDelay);
......
}
}
public void afterPropertiesSet() throws Exception {
.....
// 初始化sceduler
initSchedulerFactory(schedulerFactory);
this.scheduler = createScheduler(schedulerFactory, this.schedulerName);
//注册listener、trigger和job
registerListeners();
registerJobsAndTriggers();
......
//启动scheduler
startScheduler(this.scheduler, this.startupDelay);
......
}
}
顺着scheduler->trigger->job的思路,Spring又分别对JDK Timer、concurrent、quartz的trigger进行了封装,暴露出时间调度的配置参数,三种封装类分别为ScheduledTimerTask、ScheduledExecutorTask和CronTriggerBean+SimpleTriggerBean。三种trigger封装类分别根据实现机制的特点暴露出时间调度配置并串联起scheduler和具体job任务
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cutesource/archive/2009/11/29/4900020.aspx
分享到:
相关推荐
为了实现动态配置,我们可以使用`@ConfigurationProperties`注解解析配置文件中的定时任务参数,然后通过`@EnableScheduling`开启定时任务调度器: ```java import org.springframework.boot.context.properties....
- 当Spring容器启动时,它首先读取配置文件,解析Bean的定义,并创建一个BeanDefinition对象,该对象包含了Bean的所有信息,如类名、属性、依赖等。 - 如果有`@Component`注解的类,Spring会通过组件扫描找到并...
6. **源码解析**:理解Spring和Quartz的源码有助于我们更深入地掌握它们的工作原理。例如,`ScheduledTaskRegistrar`类是Spring调度的核心,它负责将`@Scheduled`注解的bean注册到Quartz的Trigger中。而`...
**Spring Task 深度解析与实战应用** Spring Task,也称为Spring的内置任务调度框架,是Spring Framework的一部分,它提供了在Spring应用中定义和执行定时任务的能力。这个功能强大的工具使得开发者无需依赖外部...
本篇文章将深入探讨Spring调度的使用,包括核心概念、配置方式以及源码解析。 1. **Spring调度核心组件** Spring调度主要由两个关键组件构成:`TaskScheduler`和`ThreadPoolTaskScheduler`。`TaskScheduler`是...
SpringBoot配置及使用Schedule过程解析 SpringBoot是一款流行的Java框架,提供了许多实用的功能,其中Schedule功能是其中之一。Schedule功能允许开发者创建周期性定时任务,以便在特定的时间点或间隔执行特定的任务...
以下是对这部分代码的具体解析: ##### 3.1 DispatchJobServlet 类分析 ```java public class DispatchJobServlet extends HttpServlet { private ApplicationContext ctx; public DispatchJobServlet() { ...
本文将深入解析Spring中配置定时器的方法,帮助读者理解和掌握如何在Spring环境中设置定时任务。 ### 一、Spring定时器基本概念 Spring框架提供了多种方式来实现定时任务,包括基于`java.util.Timer`的`...
本文将详细解析"springboot-task-starter.zip_grandfatherji1_spring_spring task 动态"这个压缩包所涵盖的知识点,主要关注Spring Task如何实现动态添加定时任务。 首先,`pom.xml`文件是Maven项目的配置文件,它...
《Spring与Quartz定时器深度解析》 在Java开发领域,Spring框架因其强大的功能和灵活性而备受推崇。其中,Spring对任务调度的支持是其一大亮点,尤其与Quartz的集成,使得开发者能够方便地实现定时任务。Quartz是一...
通过对给定文件中的信息进行解析,我们了解到了两种实现定时任务的方法:一种是基于 Java 标准库 `java.util.Timer` 的简单实现;另一种则是利用 Spring 框架集成 Quartz 实现更为复杂灵活的定时任务管理。这两种...
- Spring的`@Scheduled`注解处理逻辑,包括`ScheduledAnnotationBeanPostProcessor`类解析注解并生成`Trigger`。 - `TaskScheduler`接口的实现,如`ThreadPoolTaskScheduler`的源码,展示了如何创建线程池并调度任务...
3. **配置定时任务**:接下来,在Spring的配置文件中,使用`taskScheduler` bean的`schedule`方法来配置定时任务。你可以指定一个`Trigger`对象来决定任务的执行频率,或者直接传入一个`Date`来指定首次执行时间。 ...
以下是对该主题的详细解析: ### Java中的Timer定时器 #### Timer类概述 Java的`java.util.Timer`类用于调度线程在特定时间执行任务,它提供了两种任务执行方式:`schedule()`和`scheduleAtFixedRate()`。前者用于...
通过阅读这篇文章,我们可以获得更具体的实践指导,例如如何集成Uncode Schedule到Spring Boot项目中,或者如何处理并发执行和异常处理。 在学习过程中,我们还需要了解相关的设计模式,如工厂模式用于创建作业和...
8. **异常处理**:在Web服务调用中,应该处理可能出现的网络异常、解析异常等,确保任务的健壮性。 9. **日志和监控**:为了跟踪和调试,可以在Job执行前后记录日志,同时可以使用Quartz提供的监控工具或自定义监控...
以下是对这些关键概念的深入解析: 1. **@Scheduled注解**: `@Scheduled`注解是Spring提供的用于标记在方法上,表示该方法应被定期执行。你可以通过设置不同的参数来定制定时规则,如`fixedRate`(周期性执行,...
在Spring Boot应用中,我们可以利用`@Scheduled`注解来创建定时任务,这极大地简化了在Java中实现定时任务的复杂性。`@Scheduled`是Spring框架提供的一个用于执行周期性任务的注解,它可以在Spring管理的bean中使用...
标题 "framework Schedule Quartz" 暗示我们讨论的是一个基于Quartz的调度框架。Quartz是Java领域中广泛使用的开源作业调度库,它允许开发者定义、调度和执行任务。Quartz能够按照预定的时间间隔或者特定的日期触发...
5. **调度 Job**:在 Spring 中,你可以使用 `Scheduler` 的 `scheduleJob()` 方法来安排 Job 的执行。 动态修改定时任务是 Quartz 的一个重要特性,这可以通过以下方式实现: 1. **更新 Trigger**:如果你想要改变...