创业网站建设规划书,系统搭建,关于网站开发的网站,西乡网站建设公司在springboot项目中可以通过EnableAsyncAsync的方式简化异步操作#xff0c;下文使用springboot:3.2.1 源码分析 若一个bean中的公共方法上标注了Async#xff0c;在系统启动时#xff0c;会给这个类创建一个代理对象#xff0c;并将该代理对象作为bean注册到spring容器中 … 在springboot项目中可以通过EnableAsyncAsync的方式简化异步操作下文使用springboot:3.2.1 源码分析 若一个bean中的公共方法上标注了Async在系统启动时会给这个类创建一个代理对象并将该代理对象作为bean注册到spring容器中 当调用带有Async注解的方法时实际上是调用了代理对象的方法在代理对象的方法中将真正的方法交给线程池去执行 原理分析
代理方法执行时AsyncExecutionInterceptor#invoke调用determineAsyncExecutor()方法获取异步执行器然后将真实方法的执行交给异步执行器 获取Async指定的异步执行器若未指定则使用默认的异步执行器
获取默认的异步执行器 默认的异步执行器类型是ThreadPoolTaskExecutor由org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations.TaskExecutorConfiguration向spring容器中注册且核心线程数默认是8阻塞队列容量默认是Integer.MAX_VALUE可见默认的设置在生产环境使用时存在资源耗尽的风险。可通过配置文件调整配置项对应类org.springframework.boot.autoconfigure.task.TaskExecutionProperties 如果AsyncConfigurer提供了Executor则使用该Executor作为默认执行器否则通过getDefaultExecutor方法获取默认执行器 在AsyncExecutionInterceptor#getDefaultExecutor方法中首先从父类方法中获取执行器从spring容器中获取org.springframework.core.task.TaskExecutor类型的bean或者name是taskExecutor的bean若为空则使用SimpleAsyncTaskExecutor 默认情况下spring容器中并没有TaskExecutor类型的bean但是在TaskExecutorConfiguration该配置类是由TaskExecutionAutoConfiguration自动配置类使用Import导入配置类中向spring容器中注册了name是taskExecutor的bean
自定义异步执行器
自定义默认异步执行器 以下两种方式都是在自定义默认的异步执行器也就说Async不指定线程池时使用的默认异步执行器 自定义配置类并实现org.springframework.scheduling.annotation.AsyncConfigurer接口重写getAsyncExecutor方法向容器中注册TaskExecutor类型的bean覆盖内置的TaskExecutor
自定义普通异步执行器
自定义普通异步执行器的bean名称不可设置为taskExecutor且类型不可以是TaskExecutor否则会成为默认异步执行器可创建org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor对象并自定义其属性值然后将该对象注册到spring容器中
异常处理
异步方法的异常捕获和处理 默认的异常处理器SimpleAsyncUncaughtExceptionHandler 示例
2024-09-20T15:59:20.77608:00 ERROR 34764 --- [ task-1] .a.i.SimpleAsyncUncaughtExceptionHandler : Unexpected exception occurred invoking async method: public void com.example.box.dynamicproxy.TestJdkProxyServiceImpl.run()java.lang.RuntimeException: 公司又停发工资了at com.example.box.dynamicproxy.TestJdkProxyServiceImpl.run(TestJdkProxyServiceImpl.java:14) ~[classes/:na]at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]自定义异常处理器
配置类实现AsyncConfigurer接口的getAsyncUncaughtExceptionHandler()方法返回一个自定义的AsyncUncaughtExceptionHandler实现类的实例