| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -144,32 +144,67 @@ | |||
| 144 | 144 | ||
| 145 | 145 | ### Spring | |
| 146 | 146 | ||
| 147 | - * [Spring常见注解.md](docs/spring/Spring常见注解.md) | ||
| 148 | 147 | ||
| 148 | + * [SpringAOP的概念与作用](docs/spring/Spring常见注解.md) | ||
| 149 | + * [SpringBean的定义与管理(核心)](docs/spring/Spring常见注解.md) | ||
| 150 | + * [Spring中对于数据库的访问](docs/spring/Spring常见注解.md) | ||
| 151 | + * [Spring中对于校验功能的支持](docs/spring/Spring常见注解.md) | ||
| 152 | + * [Spring中的Environment环境变量](docs/spring/Spring常见注解.md) | ||
| 153 | + * [Spring中的事件处理机制](docs/spring/Spring常见注解.md) | ||
| 154 | + * [Spring中的资源管理](docs/spring/Spring常见注解.md) | ||
| 155 | + * [Spring中的配置元数据(管理配置的基本数据)](docs/spring/Spring常见注解.md) | ||
| 156 | + * [Spring事务基本用法](docs/spring/Spring常见注解.md) | ||
| 157 | + * [Spring合集](docs/spring/Spring常见注解.md) | ||
| 158 | + * [Spring容器与IOC](docs/spring/Spring常见注解.md) | ||
| 159 | + * [Spring常见注解](docs/spring/Spring常见注解.md) | ||
| 160 | + * [Spring概述](docs/spring/Spring常见注解.md) | ||
| 161 | + * [第一个Spring应用](docs/spring/Spring常见注解.md) | ||
| 162 | + | ||
| 163 | + * [Spring源码剖析:Spring概述](docs/spring/Spring源码分析/Spring源码剖析:Spring概述.md) | ||
| 164 | + * [Spring源码剖析:初探SpringIOC核心流程](docs/spring/Spring源码分析/Spring源码剖析:初探SpringIOC核心流程.md) | ||
| 165 | + * [Spring源码剖析:SpringIOC容器的加载过程 ](docs/spring/Spring源码分析/Spring源码剖析:SpringIOC容器的加载过程.md) | ||
| 166 | + * [Spring源码剖析:懒加载的单例Bean获取过程分析](docs/spring/Spring源码分析/Spring源码剖析:懒加载的单例Bean获取过程分析.md) | ||
| 167 | + * [Spring源码剖析:JDK和cglib动态代理原理详解 ](docs/spring/Spring源码分析/Spring源码剖析:JDK和cglib动态代理原理详解.md) | ||
| 168 | + * [Spring源码剖析:SpringAOP概述](docs/spring/Spring源码分析/Spring源码剖析:SpringAOP概述.md) | ||
| 169 | + * [Spring源码剖析:AOP实现原理详解 ](docs/spring/Spring源码分析/Spring源码剖析:AOP实现原理详解.md) | ||
| 170 | + * [Spring源码剖析:Spring事务概述](docs/spring/Spring源码分析/Spring源码剖析:Spring事务概述.md) | ||
| 171 | + * [Spring源码剖析:Spring事务源码剖析](docs/spring/Spring源码分析/Spring源码剖析:Spring事务源码剖析.md) | ||
| 149 | 172 | ||
| 173 | + ### SpringMVC | ||
| 150 | 174 | ||
| 151 | - * [Spring源码剖析:Spring概述](docs/spring/Spring源码剖析:Spring概述.md) | ||
| 152 | - * [Spring源码剖析:初探SpringIOC核心流程](docs/spring/Spring源码剖析:初探SpringIOC核心流程.md) | ||
| 153 | - * [Spring源码剖析:SpringIOC容器的加载过程 ](docs/spring/Spring源码剖析:SpringIOC容器的加载过程.md) | ||
| 154 | - * [Spring源码剖析:懒加载的单例Bean获取过程分析](docs/spring/Spring源码剖析:懒加载的单例Bean获取过程分析.md) | ||
| 155 | - * [Spring源码剖析:JDK和cglib动态代理原理详解 ](docs/spring/Spring源码剖析:JDK和cglib动态代理原理详解.md) | ||
| 156 | - * [Spring源码剖析:SpringAOP概述](docs/spring/Spring源码剖析:SpringAOP概述.md) | ||
| 157 | - * [Spring源码剖析:AOP实现原理详解 ](docs/spring/Spring源码剖析:AOP实现原理详解.md) | ||
| 158 | - * [Spring源码剖析:Spring事务概述](docs/spring/Spring源码剖析:Spring事务概述.md) | ||
| 159 | - * [Spring源码剖析:Spring事务源码剖析](docs/spring/Spring源码剖析:Spring事务源码剖析.md) | ||
| 175 | + * [SpringMVC中的国际化功能](docs/spring/SpringMVC/SpringMVC中的国际化功能.md) | ||
| 176 | + * [SpringMVC中的异常处理器](docs/spring/SpringMVC/SpringMVC中的异常处理器.md) | ||
| 177 | + * [SpringMVC中的拦截器](docs/spring/SpringMVC/SpringMVC中的拦截器.md) | ||
| 178 | + * [SpringMVC中的视图解析器](docs/spring/SpringMVC/SpringMVC中的视图解析器.md) | ||
| 179 | + * [SpringMVC中的过滤器Filter](docs/spring/SpringMVC/SpringMVC中的过滤器Filter.md) | ||
| 180 | + * [SpringMVC基本介绍与快速入门](docs/spring/SpringMVC/SpringMVC基本介绍与快速入门.md) | ||
| 181 | + * [SpringMVC如何实现文件上传](docs/spring/SpringMVC/SpringMVC如何实现文件上传.md) | ||
| 182 | + * [SpringMVC中的常用功能](docs/spring/SpringMVC/SpringMVC中的常用功能.md) | ||
| 160 | 183 | ||
| 161 | - ### SpringMVC | ||
| 162 | 184 | ||
| 163 | - * [SpringMVC源码分析:SpringMVC概述](docs/spring/springMVC/SpringMVC源码分析:SpringMVC概述.md) | ||
| 164 | - * [SpringMVC源码分析:SpringMVC设计理念与DispatcherServlet](docs/spring/springMVC/SpringMVC源码分析:SpringMVC设计理念与DispatcherServlet.md) | ||
| 165 | - * [SpringMVC源码分析:DispatcherServlet的初始化与请求转发 ](docs/spring/springMVC/SpringMVC源码分析:DispatcherServlet的初始化与请求转发.md) | ||
| 166 | - * [SpringMVC源码分析:DispatcherServlet如何找到正确的Controller ](docs/spring/springMVC/SpringMVC源码分析:DispatcherServlet如何找到正确的Controller.md) | ||
| 167 | - * [SpringMVC源码剖析:消息转换器HttpMessageConverter与@ResponseBody注解](docs/spring/springMVC/SpringMVC源码剖析:消息转换器HttpMessageConverter与@ResponseBody注解.md) | ||
| 168 | - * [SpringMVC源码分析:SpringMVC的视图解析原理 ](docs/spring/springMVC/SpringMVC源码分析:SpringMVC的视图解析原理.md) | ||
| 185 | + * [SpringMVC源码分析:SpringMVC概述](docs/spring/SpringMVC源码分析/SpringMVC源码分析:SpringMVC概述.md) | ||
| 186 | + * [SpringMVC源码分析:SpringMVC设计理念与DispatcherServlet](docs/spring/SpringMVC源码分析/SpringMVC源码分析:SpringMVC设计理念与DispatcherServlet.md) | ||
| 187 | + * [SpringMVC源码分析:DispatcherServlet的初始化与请求转发 ](docs/spring/SpringMVC源码分析/SpringMVC源码分析:DispatcherServlet的初始化与请求转发.md) | ||
| 188 | + * [SpringMVC源码分析:DispatcherServlet如何找到正确的Controller ](docs/spring/SpringMVC源码分析/SpringMVC源码分析:DispatcherServlet如何找到正确的Controller.md) | ||
| 189 | + * [SpringMVC源码剖析:消息转换器HttpMessageConverter与@ResponseBody注解](docs/spring/SpringMVC/SpringMVC源码剖析:消息转换器HttpMessageConverter与@ResponseBody注解.md) | ||
| 190 | + * [SpringMVC源码分析:SpringMVC的视图解析原理 ](docs/spring/SpringMVC源码分析/SpringMVC源码分析:SpringMVC的视图解析原理.md) | ||
| 169 | 191 | ||
| 170 | 192 | ### SpringBoot | |
| 171 | 193 | ||
| 172 | 194 | * [SpringBoot系列:SpringBoot的前世今生](docs/spring/SpringBoot/SpringBoot的前世今生.md) | |
| 195 | + * [给你一份SpringBoot知识清单.md](docs/spring/SpringBoot/给你一份SpringBoot知识清单.md) | ||
| 196 | + * [Spring常见注解使用指南(包含Spring+SpringMVC+SpringBoot)](docs/spring/SpringBoot/Spring常见注解使用指南(包含Spring+SpringMVC+SpringBoot).md) | ||
| 197 | + * [SpringBoot中的日志管理](docs/spring/SpringBoot/SpringBoot中的日志管理.md) | ||
| 198 | + * [SpringBoot常见注解](docs/spring/SpringBoot/SpringBoot常见注解.md) | ||
| 199 | + * [SpringBoot应用也可以部署到外部Tomcat](docs/spring/SpringBoot/SpringBoot应用也可以部署到外部Tomcat.md) | ||
| 200 | + * [SpringBoot生产环境工具Actuator](docs/spring/SpringBoot/SpringBoot生产环境工具Actuator.md) | ||
| 201 | + * [SpringBoot的Starter机制](docs/spring/SpringBoot/SpringBoot的Starter机制.md) | ||
| 202 | + * [SpringBoot的前世今生](docs/spring/SpringBoot/SpringBoot的前世今生.md) | ||
| 203 | + * [SpringBoot的基本使用](docs/spring/SpringBoot/SpringBoot的基本使用.md) | ||
| 204 | + * [SpringBoot的配置文件管理](docs/spring/SpringBoot/SpringBoot的配置文件管理.md) | ||
| 205 | + * [SpringBoot自带的热部署工具](docs/spring/SpringBoot/SpringBoot自带的热部署工具.md) | ||
| 206 | + * [SpringBoot中的任务调度与@Async](docs/spring/SpringBoot/SpringBoot中的任务调度与@Async.md) | ||
| 207 | + * [基于SpringBoot中的开源监控工具SpringBootAdmin](docs/spring/SpringBoot/基于SpringBoot中的开源监控工具SpringBootAdmin.md) | ||
| 173 | 208 | ||
| 174 | 209 | ### SpringCloud | |
| 175 | 210 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -133,11 +133,11 @@ Bean | |||
| 133 | 133 | ||
| 134 | 134 | 容器中一旦注册了Bean后处理器,Bean后处理器就会自动启动,在容器中每个Bean创建时自动工作,Bean后处理器两个方法的回调时机如下图: | |
| 135 | 135 | ||
| 136 | -  | ||
| 136 | +  | ||
| 137 | 137 | ||
| 138 | 138 | 注意一点,如果使用`BeanFactory`作为Spring容器,则必须手动注册Bean后处理器,程序必须获取Bean后处理器实例,然后手动注册。 | |
| 139 | 139 | ||
| 140 | - BeanPostProcessor bp = (BeanPostProcessor)beanFactory.getBean("bp"); beanFactory.addBeanPostProcessor(bp); Person p = (Person)beanFactory.getBean("person"); | ||
| 140 | + BeanPostProcessor bp = (BeanPostProcessor)beanFactory.getBean("bp"); beanFactory.addBeanPostProcessor(bp); Person p = (Person)beanFactory.getBean("person"); | ||
| 141 | 141 | ||
| 142 | 142 | ### 容器后处理器 | |
| 143 | 143 | ||
@@ -158,7 +158,7 @@ Spring | |||
| 158 | 158 | ||
| 159 | 159 | 在Spring配置文件中做如下配置,指定自动扫描的包: | |
| 160 | 160 | ||
| 161 | - <context:component-scan base-package="edu.shu.spring.domain"/> | ||
| 161 | + <context:component-scan base-package="edu.shu.spring.domain"/> | ||
| 162 | 162 | ||
| 163 | 163 | ### 使用@Resource配置依赖 | |
| 164 | 164 | ||
@@ -174,6 +174,7 @@ Spring | |||
| 174 | 174 | Spring提供了`@Autowired`注解来指定自动装配,`@Autowired`可以修饰setter方法、普通方法、实例变量和构造器等。当使用`@Autowired`标注setter方法时,默认采用byType自动装配策略。在这种策略下,符合自动装配类型的候选Bean实例常常有多个,这个时候就可能引起异常,为了实现精确的自动装配,Spring提供了`@Qualifier`注解,通过使用`@Qualifier`,允许根据Bean的id来执行自动装配。 | |
| 175 | 175 | ||
| 176 | 176 | # 参考文章 | |
| 177 | + | ||
| 177 | 178 | https://www.w3cschool.cn/wkspring | |
| 178 | 179 | https://www.runoob.com/w3cnote/basic-knowledge-summary-of-spring.html | |
| 179 | 180 | http://codepub.cn/2015/06/21/Basic-knowledge-summary-of-Spring | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,240 @@ | |||
| 1 | + | ||
| 2 | + | ||
| 3 | + <header> | ||
| 4 | + | ||
| 5 | + # Spring Boot调度 | ||
| 6 | + | ||
| 7 | + 以下内容仅是站长或网友个人学习笔记、总结和研究收藏。不保证正确性,因使用而带来的风险与本站无关! | ||
| 8 | + | ||
| 9 | + </header> | ||
| 10 | + | ||
| 11 | + | ||
| 12 | + | ||
| 13 | + <script>( adsbygoogle = window.adsbygoogle || []).push({});</script> | ||
| 14 | + | ||
| 15 | + | ||
| 16 | + | ||
| 17 | + 调度是执行特定时间段的任务的过程。Spring Boot为在Spring应用程序上编写调度程序提供了很好的支持。 | ||
| 18 | + | ||
| 19 | + ## Java Cron表达式 | ||
| 20 | + | ||
| 21 | + Java Cron表达式用于配置CronTrigger的实例,它是`org.quartz.Trigger`的子类。 有关Java cron表达式的更多信息,请参阅此链接 - | ||
| 22 | + | ||
| 23 | + * [https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.html](https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.html) | ||
| 24 | + | ||
| 25 | + `[@EnableScheduling](https://github.com/EnableScheduling "@EnableScheduling")`注解用于为应用程序启用调度程序。将此批注添加到主Spring Boot应用程序类文件中。 | ||
| 26 | + | ||
| 27 | + ``` | ||
| 28 | + @SpringBootApplication | ||
| 29 | + @EnableScheduling | ||
| 30 | + | ||
| 31 | + public class DemoApplication { | ||
| 32 | + public static void main(String[] args) { | ||
| 33 | + SpringApplication.run(DemoApplication.class, args); | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + ``` | ||
| 38 | + | ||
| 39 | + `[@Scheduled](https://github.com/Scheduled "@Scheduled")`注解用于在特定时间段内触发调度程序。 | ||
| 40 | + | ||
| 41 | + ``` | ||
| 42 | + @Scheduled(cron = "0 * 9 * * ?") | ||
| 43 | + public void cronJobSch() throws Exception { | ||
| 44 | + } | ||
| 45 | + | ||
| 46 | + ``` | ||
| 47 | + | ||
| 48 | + 以下是一个示例代码,演示如何在每天上午9:00开始到每天上午9:59结束执行任务。 | ||
| 49 | + | ||
| 50 | + ``` | ||
| 51 | + package com.yiibai.demo.scheduler; | ||
| 52 | + | ||
| 53 | + import java.text.SimpleDateFormat; | ||
| 54 | + import java.util.Date; | ||
| 55 | + import org.springframework.scheduling.annotation.Scheduled; | ||
| 56 | + import org.springframework.stereotype.Component; | ||
| 57 | + | ||
| 58 | + @Component | ||
| 59 | + public class Scheduler { | ||
| 60 | + @Scheduled(cron = "0 * 9 * * ?") | ||
| 61 | + public void cronJobSch() { | ||
| 62 | + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); | ||
| 63 | + Date now = new Date(); | ||
| 64 | + String strDate = sdf.format(now); | ||
| 65 | + System.out.println("Java cron job expression:: " + strDate); | ||
| 66 | + } | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + ``` | ||
| 70 | + | ||
| 71 | + 以下屏幕截图显示了应用程序如何在`09:03:23`启动,并且从那时起每隔一分钟执行一次cron作业调度程序任务。 | ||
| 72 | + | ||
| 73 | +  | ||
| 74 | + | ||
| 75 | + ## 固定速率 | ||
| 76 | + | ||
| 77 | + 固定速率调度程序用于在特定时间执行任务。它不等待前一个任务的完成。 值是以毫秒为单位。 示例代码显示在此处 - | ||
| 78 | + | ||
| 79 | + ``` | ||
| 80 | + @Scheduled(fixedRate = 1000) | ||
| 81 | + public void fixedRateSch() { | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + ``` | ||
| 85 | + | ||
| 86 | + 此处显示了应用程序启动时每秒执行任务的示例代码 - | ||
| 87 | + | ||
| 88 | + ``` | ||
| 89 | + package com.yiibai.demo.scheduler; | ||
| 90 | + | ||
| 91 | + import java.text.SimpleDateFormat; | ||
| 92 | + import java.util.Date; | ||
| 93 | + import org.springframework.scheduling.annotation.Scheduled; | ||
| 94 | + import org.springframework.stereotype.Component; | ||
| 95 | + | ||
| 96 | + @Component | ||
| 97 | + public class Scheduler { | ||
| 98 | + @Scheduled(fixedRate = 1000) | ||
| 99 | + public void fixedRateSch() { | ||
| 100 | + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); | ||
| 101 | + | ||
| 102 | + Date now = new Date(); | ||
| 103 | + String strDate = sdf.format(now); | ||
| 104 | + System.out.println("Fixed Rate scheduler:: " + strDate); | ||
| 105 | + } | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + ``` | ||
| 109 | + | ||
| 110 | + 请注意以下屏幕截图,其中显示了在`09:12:00`启动的应用程序,之后每隔一个固定速率调度程序执行任务。 | ||
| 111 | + | ||
| 112 | +  | ||
| 113 | + | ||
| 114 | + ## 固定延迟 | ||
| 115 | + | ||
| 116 | + 固定延迟调度程序用于在特定时间执行任务。 它应该等待上一个任务完成。 值应以毫秒为单位。 此处显示示例代码 - | ||
| 117 | + | ||
| 118 | + ``` | ||
| 119 | + @Scheduled(fixedDelay = 1000, initialDelay = 1000) | ||
| 120 | + public void fixedDelaySch() { | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + ``` | ||
| 124 | + | ||
| 125 | + 这里,`initialDelay`是在初始延迟值之后第一次执行任务的时间。 | ||
| 126 | + | ||
| 127 | + 从应用程序启动完成`3`秒后每秒执行一次任务的示例如下所示 - | ||
| 128 | + | ||
| 129 | + ``` | ||
| 130 | + package com.yiibai.demo.scheduler; | ||
| 131 | + | ||
| 132 | + import java.text.SimpleDateFormat; | ||
| 133 | + import java.util.Date; | ||
| 134 | + import org.springframework.scheduling.annotation.Scheduled; | ||
| 135 | + import org.springframework.stereotype.Component; | ||
| 136 | + | ||
| 137 | + @Component | ||
| 138 | + public class Scheduler { | ||
| 139 | + @Scheduled(fixedDelay = 1000, initialDelay = 3000) | ||
| 140 | + public void fixedDelaySch() { | ||
| 141 | + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); | ||
| 142 | + Date now = new Date(); | ||
| 143 | + String strDate = sdf.format(now); | ||
| 144 | + System.out.println("Fixed Delay scheduler:: " + strDate); | ||
| 145 | + } | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + ``` | ||
| 149 | + | ||
| 150 | + 执行上面代码后,它会显示在`09:18:39`开始的应用程序,每`3`秒后,固定延迟计划程序任务(每秒执行一次)。 | ||
| 151 | + | ||
| 152 | + | ||
| 153 | + | ||
| 154 | + | ||
| 155 | + | ||
| 156 | + //更多请阅读:https://www.yiibai.com/spring-boot/spring_boot_scheduling.html | ||
| 157 | + | ||
| 158 | + @EnableAsync 注解 | ||
| 159 | + 要使用 @Async,首先需要使用 @EnableAsync 注解开启 Spring Boot 中的异步特性。 | ||
| 160 | + | ||
| 161 | + @Configuration | ||
| 162 | + @EnableAsync | ||
| 163 | + public class AppConfig { | ||
| 164 | + } | ||
| 165 | + 更详细的配置说明,可以参考:AsyncConfigurer(opens new window) | ||
| 166 | + | ||
| 167 | + #@Async 注解 | ||
| 168 | + #支持的用法 | ||
| 169 | + (1)无入参无返回值方法 | ||
| 170 | + | ||
| 171 | + 您可以用 @Async 注解修饰方法,这表明这个方法是异步方式调用。换句话说,程序在调用此方法时会立即返回,而方法的实际执行发生在已提交给 Spring TaskExecutor 的任务中。在最简单的情况下,您可以将注解应用于返回 void 的方法,如以下示例所示: | ||
| 172 | + | ||
| 173 | + @Async | ||
| 174 | + void doSomething() { | ||
| 175 | + // this will be executed asynchronously | ||
| 176 | + } | ||
| 177 | + (2)有入参无返回值方法 | ||
| 178 | + | ||
| 179 | + 与使用 @Scheduled 注释注释的方法不同,这些方法可以指定参数,因为它们在运行时由调用者以“正常”方式调用,而不是由容器管理的调度任务调用。例如,以下代码是 @Async 注解的合法应用: | ||
| 180 | + | ||
| 181 | + @Async | ||
| 182 | + void doSomething(String s) { | ||
| 183 | + // this will be executed asynchronously | ||
| 184 | + } | ||
| 185 | + (3)有入参有返回值方法 | ||
| 186 | + | ||
| 187 | + 甚至可以异步调用返回值的方法。但是,这些方法需要具有 Future 类型的返回值。这仍然提供了异步执行的好处,以便调用者可以在调用 Future 上的 get() 之前执行其他任务。以下示例显示如何在返回值的方法上使用@Async: | ||
| 188 | + | ||
| 189 | + @Async | ||
| 190 | + Future<String> returnSomething(int i) { | ||
| 191 | + // this will be executed asynchronously | ||
| 192 | + } | ||
| 193 | + #不支持的用法 | ||
| 194 | + @Async 不能与生命周期回调一起使用,例如 @PostConstruct。 | ||
| 195 | + | ||
| 196 | + 要异步初始化 Spring bean,必须使用单独的初始化 Spring bean,然后在目标上调用 @Async 带注释的方法,如以下示例所示: | ||
| 197 | + | ||
| 198 | + public class SampleBeanImpl implements SampleBean { | ||
| 199 | + | ||
| 200 | + @Async | ||
| 201 | + void doSomething() { | ||
| 202 | + // ... | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + } | ||
| 206 | + | ||
| 207 | + public class SampleBeanInitializer { | ||
| 208 | + | ||
| 209 | + private final SampleBean bean; | ||
| 210 | + | ||
| 211 | + public SampleBeanInitializer(SampleBean bean) { | ||
| 212 | + this.bean = bean; | ||
| 213 | + } | ||
| 214 | + | ||
| 215 | + @PostConstruct | ||
| 216 | + public void initialize() { | ||
| 217 | + bean.doSomething(); | ||
| 218 | + } | ||
| 219 | + | ||
| 220 | + } | ||
| 221 | + #明确指定执行器 | ||
| 222 | + 默认情况下,在方法上指定 @Async 时,使用的执行器是在启用异步支持时配置的执行器,即如果使用 XML 或 AsyncConfigurer 实现(如果有),则为 annotation-driven 元素。但是,如果需要指示在执行给定方法时应使用默认值以外的执行器,则可以使用 @Async 注解的 value 属性。以下示例显示了如何执行此操作: | ||
| 223 | + | ||
| 224 | + @Async("otherExecutor") | ||
| 225 | + void doSomething(String s) { | ||
| 226 | + // this will be executed asynchronously by "otherExecutor" | ||
| 227 | + } | ||
| 228 | + 在这种情况下,“otherExecutor”可以是 Spring 容器中任何 Executor bean 的名称,也可以是与任何 Executor 关联的限定符的名称(例如,使用 <qualifier> 元素或 Spring 的 @Qualifier 注释指定) )。 | ||
| 229 | + | ||
| 230 | + #管理 @Async 的异常 | ||
| 231 | + 当 @Async 方法的返回值类型为 Future 型时,很容易管理在方法执行期间抛出的异常,因为在调用 get 结果时会抛出此异常。但是,对于返回值类型为 void 型的方法,异常不会被捕获且无法传输。您可以提供 AsyncUncaughtExceptionHandler 来处理此类异常。以下示例显示了如何执行此操作: | ||
| 232 | + | ||
| 233 | + public class MyAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler { | ||
| 234 | + | ||
| 235 | + @Override | ||
| 236 | + public void handleUncaughtException(Throwable ex, Method method, Object... params) { | ||
| 237 | + // handle exception | ||
| 238 | + } | ||
| 239 | + } | ||
| 240 | + 默认情况下,仅记录异常。您可以使用 AsyncConfigurer 或 <task:annotation-driven /> XML 元素定义自定义 AsyncUncaughtExceptionHandler。 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments