CreateArtTechnology
/ Blog
Login
最新文章
Java
语言相关
库相关
虚拟机相关
CreateArtTechnology
项目搭建
使用的工具
自研的工具
开源工具
ELK
ElasticSearch
Jenkins
Markdown
GraphQL
Arthas
生产工具
Linux
Nginx
VersionControl
Subversion
Git
Redis
Archiva
Maven
Zookeeper
Spring
SpringBoot
MySql
HBase
Cassandra
容器化
Docker
Kubernetes
服务容器化从零开始
未分类笔记
算法相关
概念相关
豆知识
机器学习
机器学习从零开始
Spring任务的配置与使用
35
2019-04-24 20:52:48
生产工具
Spring
## Spring任务说明 Spring任务分为异步任务和定时(周期)任务。 - 异步任务时表示Spring分配另一个线程执行这个任务 - 定时任务表示任务在预设的时间在由Spring分配线程执行,周期任务可以转化为定时任务,这里看做一种 在Spring中,异步和定时任务由`org.springframework.core.task.TaskExecutor`接口的实现类执行,常见的TaskExecutor如下: - `SimpleAsyncTaskExecutor` 每次调度的时候都会启用一个新的线程执行任务。 - `ConcurrentTaskExecutor` 接收一个java.util.concurrent.Executor对象作为参数,然后执行任务的时候会使用内部的java.util.concurrent.Executor调度。 - `ThreadPoolTaskExecutor` TaskExecutor的线程池实现,类似于JDK的ThreadPoolExecutor,可以进行线程池的大小定义等。 - `ThreadPoolTaskScheduler` 可以定时执行任务的实现,同时实现了TaskExecutor接口和TaskScheduler接口。 ## Spring任务的配置 **xml配置** ```xml
``` 查看`task:annotation-driven`的定义,可以找到executor和scheduler参数的说明: **executor** > Specifies the java.util.Executor instance to use when invoking asynchronous methods. If not provided, an instance of org.springframework.core.task.SimpleAsyncTaskExecutor will be used by default. 说明executor是用于执行异步任务的,且默认使用`SimpleAsyncTaskExecutor`,即每次新创建一个线程执行。 使用`@Async`注解的方法会使用executor执行。 **scheduler** > Specifies the org.springframework.scheduling.TaskScheduler or java.util.ScheduledExecutorService instance to use when invoking scheduled methods. If no reference is provided, a TaskScheduler backed by a single thread scheduled executor will be used. 说明scheduler是用于执行定时任务的,且默认使用一个单线程的线程池。 如果不设置scheduler的线程池大小,可能会导致多任务情况下任务排队进行,即后边的任务已经到设定的运行时间了,也得等前边的任务运行完毕。 使用`@Scheduled`注解的方法会使用scheduler执行。 ## 使用基于注解的任务 配置过注解扫描后,可以在代码中给任务方法添加注解 ### Async注解 使用`@Async`注解后相当于Spring将这个方法包装进一个Runnable(或Callable?),并提交到executor的队列中异步执行,因此方法的返回结果应该是Future类型。 ```java @Async public Future
someMethodAsync(){ return new AsyncResult<>(someMethod()); } ``` ### Scheduled注解 使用`@Scheduled`注解后,方法会定时或周期性执行。 配置不当可能导致任务并非按预期时间执行,参考上文单线程执行的问题和下文的参数问题。 **ps.需要使用无参的void方法,否则会报错** **pps.请注意多机部署时周期任务的资源竞争问题** **定时任务**常用的参数: - `cron`:类似Linux的crontab功能,可以配置6~7个值,用于指定触发时间。 ```java // 每天0点3分执行 @Scheduled(cron = "0 3 0 * * *") ...... // 每5s执行一次 @Scheduled(cron = "*/5 * * * * *") ...... ``` 具体的cron表达式规则可以在网上找,这里列个字段说明:`"{秒} {分} {时} {日} {月} {周几} {年(可选)}"`。 **周期任务**常用的参数: - `fixedDelay`:执行间隔,即上一个任务完成,到这个任务开始的间隔,单位ms - `fixedRate`:执行周期,即上一个任务开始,到这个任务开始的间隔,单位ms - `initialDelay`:初始延迟,单位ms ```java // 启动后10秒执行第一次,之后每5秒开始执行一次 @Scheduled(initialDelay = 10000, fixedRate = 5000) ...... // 启动后就执行,每个任务执行完5秒后开始执行下一次任务 @Scheduled(fixedDelay = 5000) ...... ``` ## 参考资料 [Spring(28)——Task抽象 - Elim的博客 - ITeye博客](https://elim.iteye.com/blog/2426493)
发布文章 101
文章被阅读 1597
最近修改
什么是“丝滑”的曲线
2021-12-08 15:19:20
高效空间数据索引R树及其批量加载方法STR简介
2021-09-29 20:33:37
关于分库分表的一些事儿
2021-06-25 11:51:25
获得诺奖的稳定匹配理论之TTC算法与GS算法
2021-03-14 23:04:48
算法小白的机器学习入门实践,从零到上线
2021-01-13 14:28:27
分站宗旨
一站式资料平台,减少重复检索,减少重复采坑。