SpringBoot中开启异步任务

SpringBoot中开启异步任务,第1张

顾名思义,异步指的是处理数据时、与主请求不在同一干线、分开支路处理请求,可以为用户提供较为良好的体验、在开发过程中,不影响正常使用的前提下,建议使用异步来处理请求。

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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10152196.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存