From b1ff440a5fdef79c972389ca95cc7749c16398d8 Mon Sep 17 00:00:00 2001 From: Rikako Wu <496063163@qq.com> Date: Sun, 8 Jan 2023 22:50:58 +0800 Subject: [PATCH] =?UTF-8?q?1/8/2023=09=E5=AE=8C=E6=88=90Spring=20=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=BC=82=E6=AD=A5=E5=92=8C=E8=B0=83=E5=BA=A6=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=9A=84=E6=96=87=E6=A1=A3=E9=98=85=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring/spring boot/Spring Boot Async.md | 58 ++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/spring/spring boot/Spring Boot Async.md b/spring/spring boot/Spring Boot Async.md index b06d517..c0903b2 100644 --- a/spring/spring boot/Spring Boot Async.md +++ b/spring/spring boot/Spring Boot Async.md @@ -1,3 +1,22 @@ +- [Spring Boot Async](#spring-boot-async) + - [Spring Executor和Scheduler的自动配置](#spring-executor和scheduler的自动配置) + - [Task Execution and Scheduling](#task-execution-and-scheduling) + - [Task Execution Abstraction](#task-execution-abstraction) + - [TaskExecutor接口的实现种类](#taskexecutor接口的实现种类) + - [TaskExecutor的使用](#taskexecutor的使用) + - [Spring TaskScheduler Abstraction](#spring-taskscheduler-abstraction) + - [Trigger接口](#trigger接口) + - [Trigger实现类](#trigger实现类) + - [TaskScheduler实现类](#taskscheduler实现类) + - [对任务调度和异步执行的注解支持](#对任务调度和异步执行的注解支持) + - [启用Scheduling注解](#启用scheduling注解) + - [@Scheduled注解](#scheduled注解) + - [@Async注解](#async注解) + - [@Async方法的异常处理](#async方法的异常处理) + - [Cron表达式](#cron表达式) + - [Macros(宏)](#macros宏) + + # Spring Boot Async ## Spring Executor和Scheduler的自动配置 当当前上下文中没有Executor类型的bean对象时,spring boot会自动配置一个ThreadPoolTaskExecutor类型的bean对象,并且将该bean对象和异步task执行(@EnableAsync)和spring mvc异步请求处理关联在一起。 @@ -179,4 +198,41 @@ public class SampleBeanInitializer { } } -``` \ No newline at end of file +``` +### @Async方法的异常处理 +当@Async方法的返回类型是Future类型时,处理async方法执行时抛出的异常非常简单,当在Future对象上调用get方法时异常会被抛出。**但当@Async方法的返回类型是void时,执行时抛出的异常既无法被捕获也无法被传输。可以指定一个AsyncUncaughtExceptionHandler来处理此类异常。** +```java +public class MyAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler { + + @Override + public void handleUncaughtException(Throwable ex, Method method, Object... params) { + // handle exception + } +} +``` +### Cron表达式 +在Spring中,cron表达式格式如下: +\* \* \* \* \* \* +其代表为(s,min,hour,day of month/\*(1~31)\*/,month/\*(1~12)\*/,day of week/\*(0~7,0 or 7 is sun)\*/) +> 规则如下: +> - 所有字段都可以用(*)来匹配所有值 +> - 逗号(,)可以用来分隔同一字段中多个值 +> - 分号(-)可以用来指定范围,指定的范围左右都包含,eg,1-5代表[1,5] +> - 在范围(或是*)后跟随下划线(/)代表间隔,如在分钟字段指定*/20,代表该小时内每过20min +> - 对于月份或者day of week,可以使用英文名的前三个字母来代替,大小写不敏感 +> - 在day of month或day of week字段中可以包含L字母 +> - 在day of month字段,L代表该月的最后一天,在该字段还可以为L指定一个负的偏移量,如L-n代表该月的倒数第n+1天 +> - 在day of week字段,L代表该周的最后一天,L前还可以前缀月份的数字或是月份的前三个字母(dL或DDDL,如7L或sunL,代表该月份的最后一个星期日),代该月份的最后一个day of week +> - day of month字段可以指定为nW,代表离day of month为n最近的一个工作日,如果n为周六,则该该字段代表的值为周五的day of month,如果n为周六,则该字段代表下周一的day of month(如果n为1其位于周六,其也代表下周一的day of month,1W代表该月的第一个工作日) +> - 如果day of month的值为LW,则代表该月的最后一个工作日 +> - day of week字段还能指定为d#n或DDD#n的形式,代表该月的的第几个d in week(例如SUN#2,代表当前月的第二个星期日) + +#### Macros(宏) +Cron表达式可读性不太好,可以使用如下预定义的宏: +| Macro | meaning | +|:-:|:-:| +| @yearly (or @annually) | once a year (0 0 0 1 1 *) | +| @monthly | once a month (0 0 0 1 * *) | +| @weekly | once a week (0 0 0 * * 0) | +| @daily (or @midnight) | once a day (0 0 0 * * *), or | +| @hourly | once an hour, (0 0 * * * *) |