Spring注解方式实现任务调度
原文:http://docs.spring.io/spring/docs/4.0.1.BUILD-SNAPSHOT/javadoc-api/
注解类型:EnableScheduling
1 | @Target (value=TYPE) @Retention (value=RUNTIME) @Import (value=SchedulingConfiguration. class ) @Documentedpublic @interface EnableScheduling |
使用该注解让Spring可以进行任务调度,功能类似于Spring的xml命名空间<task:*>
使用 @EnableScheduling 注解的类示例:
1 | @Configuration @EnableSchedulingpublic class AppConfig { // 各种@bean的定义 // various @Bean definitions} |
使用@Scheduled注解可以被Spring容器检测。使用示例:
1 | package com.myco.tasks; public class MyTask { @Scheduled (fixedRate= 1000 ) public void work() { // 任务执行逻辑 // task execution logic } } |
下面的配置使MyTask.work()每1000毫秒被执行一次:
1 | @Configuration @EnableSchedulingpublic class AppConfig { @Bean public MyTask task() { return new MyTask(); }} |
如果MyTask使用了@Component注解,下面的配置方式也可以让使用了@Scheduled注解的方法在设置的时间间隔里面被调用:
1 | @Configuration @ComponentScan (basePackages= "com.myco.tasks" ) public class AppConfig {} |
使用了@Scheduled注解方法也可以在使用了@Configuration注解的类里面使用:
1 | @Configuration @EnableSchedulingpublic class AppConfig { @Scheduled (fixedRate= 1000 ) public void work() { // task execution logic }} |
上面介绍的都是在单线程的情况下执行任务调度的。如果希望进行更多的控制,我们可以让使用@Configuration注解的类实现SchedulingConfigurer接口,这样就可以访问底层的ScheduledRegistrar实例。
下面的例子演示如何定制Executer去执行任务计划:
1 | @Configuration @EnableSchedulingpublic class AppConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(taskExecutor()); } @Bean (destroyMethod= "shutdown" ) public Executor taskExecutor() { return Executors.newScheduledThreadPool( 100 ); }} |
注意上面例子中使用的@bean(destroyMethod="shutdown")。这样是为了确保当Spring应用上下文关闭的时候任务执行者也被正确地关闭。实现SchedulingConfigurar接口还允许细粒度控制任务通过ScheduledTaskRegistrar进行登记。
例如,下面的配置使用自定义的Trigger执行bean的方法
1 | @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(); } } |
作为参考,上面的例子和下面使用XML配置方式的作用是一样的:
1 | < beans > < task:annotation-driven scheduler="taskScheduler"/> < task:scheduler id="taskScheduler" pool-size="42"/> < task:scheduled ref="myTask" method="work" fixed-rate="1000"/> < bean id="myTask" class="com.foo.MyTask"/></ beans > |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2016-11-14 primefaces 查询 点击按钮 加载 动画 ajax loader