顾名思义,异步指的是处理数据时、与主请求不在同一干线、分开支路处理请求,可以为用户提供较为良好的体验、在开发过程中,不影响正常使用的前提下,建议使用异步来处理请求。
1、在主启动类加上注解@EnableAsync
2、在要开启异步任务的方法上加注解@Async
3、异步任务开启成功
有一些业务需求,需要是异步进行的,不能影响当前线程的运行,在spring boot中则能通过注解和配置快速实现这个。
首先写个异步线程池配置类,如下:
@Configuration@EnableAsyncpublic class AsyncConfig {
@Value("${asyncexecutorthreadcore_pool_size}") private int corePoolSize; @Value("${asyncexecutorthreadmax_pool_size}") private int maxPoolSize; @Value("${asyncexecutorthreadqueue_capacity}") private int queueCapacity; private String threadNamePrefix = "AsyncExecutorThread-"; @Bean(name = "asyncExecutor") public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executorsetCorePoolSize(corePoolSize);
executorsetMaxPoolSize(maxPoolSize);
executorsetQueueCapacity(queueCapacity);
executorsetThreadNamePrefix(threadNamePrefix);
executorsetRejectedExecutionHandler(new ThreadPoolExecutorCallerRunsPolicy());
executorinitialize(); return executor;
}
}1234567891011121314151617181920212223242526272829
然后将需要异步执行的业务步骤写成方法用@sync注解即可,如下:
@Componentpublic class AsyncExecutorCommon {
@Async("asyncExecutor") public void loadPic(IfcTingshenJzml tsJzml,
WsTingshenJzmlService wsTingshenJzmlService) {
List<IfcTingshenJzml> tsJzmls = new ArrayList<IfcTingshenJzml>();
tsJzmlsadd(tsJzml);
wsTingshenJzmlServicedocService(tsJzmls);
}
}12345678910
在业务代码里直接调用这个方法即可,这个方法的执行就是异步的。注意,异步方法和调用异步的方法不能写在一个类里,否则会报循环依赖异常,建议另建一个类,只用来放异步方法。
我之前用了很久的@Async都不知道异步方法和调用方竟然不能在通一类,原因是@Async利用spring的aop调用方式,在同一个类里无法形成切面。
注意如果不自定义异步方法的线程池默认使用SimpleAsyncTaskExecutor。SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。并发大的时候会产生严重的性能问题。
看下面demo,首先创建线程池
第二部直接在调用方的注解加上,线程池bean的名字
不能在本类中直接调用方法,需要使用组件的实例调用
以下是异步方法失效的原因:
一、异步方法使用static修饰
二、异步类没有使用@Component注解(或其他注解)导致spring无法扫描到异步类
三、测试异步方法不能与异步方法在同一个类中
四、测试类中需要使用@Autowired或@Resource等注解自动注入,不能自己手动new对象
五、如果使用SpringBoot框架必须在启动类中增加@EnableAsync注解
不起作用
起作用
我们可以通过AOP的机制和织入点来判断。
转: >
以上就是关于SpringBoot中开启异步任务全部的内容,包括:SpringBoot中开启异步任务、springboot中如何使用线程池及异步线程、springboot异步注解@Async等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)