spring EnableScheduling标签使用详解

原创 2017年08月29日 06:36:39




@Target(value=TYPE)

 @Retention(value=RUNTIME)

 @Import(value=SchedulingConfiguration.class)

 @Documented

public@interfaceEnableScheduling

Enables Spring's scheduled task execution capability, similar tofunctionality found in Spring's <task:*> XML namespace. To be used on @Configuration classes as follows:( 启用Spring调度任务执行功能,类似于Spring<task:*> XML命名空间中的功能。要在@Configuration类中使用如下:)

@Configuration
 @EnableScheduling
 public class AppConfig {
 
     // various @Bean definitions
 }

This enables detection of @Scheduled annotations on any Spring-managed bean in the container. Forexample, given a class MyTask(这样可以检测容器中任何Spring管理的bean上的@Scheduled注释。 例如,给定一个类MyTask)

package com.myco.tasks;
 
 public class MyTask {
 
     @Scheduled(fixedRate=1000)
     public void work() {
         // task execution logic
     }
 }

the following configuration would ensure that MyTask.work() is called once every 1000 ms:(以下配置将确保每1000ms调用一次MyTask.work())

@Configuration
 @EnableScheduling
 public class AppConfig {
 
     @Bean
     public MyTask task() {
         return new MyTask();
     }
 }

Alternatively, if MyTask were annotated with @Component, the following configuration would ensure thatits @Scheduled method is invoked at the desired interval:( 或者,如果MyTask用@Component注释,则以下配置将确保以所需间隔调用其@Scheduled方法:)

@Configuration
 @EnableScheduling
 @ComponentScan(basePackages="com.myco.tasks")
 public class AppConfig {
 }

Methods annotated with @Scheduled may even be declared directly within @Configuration classes: (@Scheduled注释的方法甚至可以直接在@Configuration类中声明:)

@Configuration
 @EnableScheduling
 public class AppConfig {
 
     @Scheduled(fixedRate=1000)
     public void work() {
         // task execution logic
     }
 }

By default, will be searching for an associated scheduler definition:either a unique TaskScheduler bean in the context, or a TaskScheduler bean named "taskScheduler" otherwise; the samelookup will also be performed for a ScheduledExecutorService bean. If neither of the two is resolvable, a localsingle-threaded default scheduler will be created and used within the registrar. 默认情况下,将搜索关联的调度程序定义:上下文中的唯一TaskScheduler bean,否则命名为“taskScheduler”的TaskScheduler bean; 对于ScheduledExecutorService bean也将执行相同的查找。 如果两者都不可解析,则将在注册器中创建并使用本地单线程默认调度程序。

When more control is desired, a @Configuration class may implement SchedulingConfigurer. This allows access to the underlying ScheduledTaskRegistrar instance. For example, the following example demonstrates howto customize the Executor used to execute scheduled tasks: (当需要更多的控制时,@Configuration类可以实现SchedulingConfigurer。 这允许访问底层的ScheduledTaskRegistrar实例。 例如,以下示例演示了如何自定义用于执行计划任务的执行程序:)

@Configuration
 @EnableScheduling
 public class AppConfig implements SchedulingConfigurer {
 
     @Override
     public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
         taskRegistrar.setScheduler(taskExecutor());
     }
 
     @Bean(destroyMethod="shutdown")
     public Executor taskExecutor() {
         return Executors.newScheduledThreadPool(100);
     }
 }

Note in the example above the use of @Bean(destroyMethod="shutdown"). This ensures that the task executor is properlyshut down when the Spring application context itself is closed. (注意在上面的例子中使用@Bean(destroyMethod =“shutdown”)。这确保了在Spring应用程序上下文本身关闭时,任务执行程序被正确关闭。)

Implementing SchedulingConfigurer also allows for fine-grained control over task registrationvia the ScheduledTaskRegistrar. For example, the following configures theexecution of a particular bean method per a custom Trigger implementation: (实现SchedulingConfigurer还允许通过ScheduledTaskRegistrar对任务注册进行细粒度的控制。 例如,以下配置每个自定义触发器实现的特定bean方法的执行:)

@Configuration
 @EnableScheduling
 public class AppConfig implements SchedulingConfigurer {
 
     @Override
     public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
         taskRegistrar.setScheduler(taskScheduler());
         taskRegistrar.addTriggerTask(
             new Runnable() {
                 public void run() {
                     myTask().work();
                 }
             },
             new CustomTrigger()
         );
     }
 
     @Bean(destroyMethod="shutdown")
     public Executor taskScheduler() {
         return Executors.newScheduledThreadPool(42);
     }
 
     @Bean
     public MyTask myTask() {
         return new MyTask();
     }
 }

For reference, the example above can be compared to the following SpringXML configuration: (作为参考,上述示例可以与以下SpringXML配置进行比较:)

<beans>
 
     <task:annotation-driven scheduler="taskScheduler"/>
 
     <task:scheduler id="taskScheduler" pool-size="42"/>
 
     <task:scheduled-tasks scheduler="taskScheduler">
         <task:scheduled ref="myTask" method="work" fixed-rate="1000"/>
     </task:scheduled-tasks>
 
     <bean id="myTask" class="com.foo.MyTask"/>
 
 </beans>

The examples are equivalent save that in XML a fixed-rate period is used instead of a custom Trigger implementation; this is because the task: namespace scheduled cannot easily expose such support. This is but onedemonstration how the code-based approach allows for maximum configurabilitythrough direct access to actual componentry. (这些示例是等效的,除了在XML中使用固定速率周期而不是自定义触发器实现; 这是因为任务:命名空间调度不能轻易暴露出这样的支持。这只是一个演示,基于代码的方法如何通过直接访问实际组件来实现最大的可配置性。)


参考资料链接:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html

 


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【Spring】Spring高级话题-计划任务-@EnableScheduling

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自【大学之旅_谙忆的博客】 【Spring】基于IntelliJ IDEA搭建Maven分析要实现计划任务,首先...

【Spring】Spring高级话题-计划任务-@EnableScheduling

进行本示例的演示,需要先配置好Maven和spring哦、  见:  http://blog.csdn.net/qq_26525215/article/details/53010442 ...

【Spring】Spring高级话题-@Enable***注解的工作原理

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自【大学之旅_谙忆的博客】 @EnableAspectJAutoProxy @EnableAspect...

spring定时任务

参考资料:Spring Framework Reference Documentation 3.2.4.RELEASE的Part VI. Integration的27. Task Execution ...

Spring @EnableScheduling 注解解析

概述Spring 的@EnableScheduling 为我们提供了快速的基于多种规则的任务调度功能。在《Spring 4.x Task 和 Schedule 概述》一文中对Spring 实现的异步任...

spring定时任务详解(@Scheduled注解)

在springMVC里使用spring的定时任务非常的简单,如下: (一)在xml里加入task的命名空间 xmlns:task="http://www.springframework.org/sc...

Spring任务调度Scheduling Tasks

注解方式第一步、创建maven工程,引入依赖 org.springframework.boot spring-boot-starter-parent 1.4.0.RELEASE...

使用Spring做定时任务工程

一般常使用Spring做Web工程,但如果我们只想使用Spring做一个定时任务工程的话,应该怎么用呢?     答案是,加@EnableScheduling注解。 下面是一个例子,这个例子中我们使用...
  • hotdust
  • hotdust
  • 2016年09月27日 17:37
  • 1792

@Scheduled不执行的原因

1. 今天用@Schedule做了一个定时任务,希望凌晨1点执行,代码如下@Service public class ParseJsonService { @Scheduled(cron =...

Spring Boot系列三 Spring @EnableScheduling 定时任务用法总结

原理 TaskScheduler TaskScheduler是spring的定时任务使用的线程池的关键类 public interface TaskScheduler { // 通过Tr...
  • hry2015
  • hry2015
  • 2017年04月06日 19:46
  • 372
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring EnableScheduling标签使用详解
举报原因:
原因补充:

(最多只允许输入30个字)