一、线程池配置
- SpringBoot有默认线程池配置,可以不自定义直接使用,但为了配置更加灵活,推荐使用自定义配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
* author: yangyk
* date: 2020/9/17 10:47
* description:线程池配置
*/
@Configuration
@EnableAsync
public class ThreadPoolTaskConfig {
/**
* 核心线程数(默认线程数)
*/
private static final int SIZE_CORE_POOL = 5;
/**
* 最大线程数
*/
private static final int SIZE_MAX_POOL = 20;
/**
* 允许线程空闲时间(单位:默认为秒)
*/
private static final int ALIVE_TIME = 60;
/**
* 缓冲队列大小
*/
private static final int QUEUE_CAPACITY = 100;
/**
* 线程池名前缀
*/
private static final String THREAD_NAME_PREFIX = "Async-Service-";
/**
* 默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,
* 当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;
* 当队列满了,就继续创建线程,当线程数量大于等于maxPoolSize后,开始使用拒绝策略拒绝
*/
@Bean("asyncServiceExecutor") // bean的名称,默认为首字母小写的方法名
public ThreadPoolTaskExecutor asyncServiceExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(SIZE_CORE_POOL);
executor.setMaxPoolSize(SIZE_MAX_POOL);
executor.setQueueCapacity(QUEUE_CAPACITY);
executor.setKeepAliveSeconds(ALIVE_TIME);
executor.setThreadNamePrefix(THREAD_NAME_PREFIX);
// 线程池对拒绝任务的处理策略
// CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
}
二、异步处理
- 在需要异步线程处理的方法上添加@Async(“asyncServiceExecutor”)注解即可,asyncServiceExecutor为自定义线程池bean的名字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Component
@Log4j2
public class QrcodeAsyncServiceImpl implements QrcodeAsyncService {
@Resource
private com.spring.learning.dao.cosmo.BaseBarcodeInfoDao baseBarcodeInfoDao;
@Resource
private com.spring.learning.dao.qrcode.BaseDataGroupDao baseDataGroupDao;
@Async("asyncServiceExecutor")
@MultiDataSourceTransactional(value = {"qrcodeTransactionManager", "cosmoTransactionManager"})
@Override
public void createQrcodeAsync() {
BaseBarcodeInfoModel model = new BaseBarcodeInfoModel();
model.setCreateTime(new Date());
model.setUpdateUserCode("test");
model.setUpdateTime(new Date());
model.setSpare1("test");
baseBarcodeInfoDao.insert(model);
BaseDataGroupModel baseDataGroupModel = new BaseDataGroupModel();
baseDataGroupModel.setGroupCode("test1");
baseDataGroupModel.setGroupDesc("test2");
baseDataGroupDao.insert(baseDataGroupModel);
throw new RuntimeException();
}
}