Skip to content

Latest commit

 

History

History
71 lines (54 loc) · 2.75 KB

File metadata and controls

71 lines (54 loc) · 2.75 KB
 
Nov 23, 2018
Nov 23, 2018
1
---
2
layout : wiki
3
title : Async
4
summary : Spring 에서의 비동기 처리 방법
5
date : 2018-11-19 14:58:51 +0900
May 10, 2019
May 10, 2019
6
updated : 2019-05-10 09:14:36 +0900
Nov 23, 2018
Nov 23, 2018
7
tags : spring, async, task_executor
8
toc : true
9
public : true
10
parent : Spring
11
latex : false
Mar 26, 2019
Mar 26, 2019
12
adsense : true
Nov 23, 2018
Nov 23, 2018
13
---
14
* TOC
15
{:toc}
16
17
# 참고자료
18
* [동기 vs 비동기 / sync vs async](https://www.youtube.com/watch?v=HKlUvCv9hvA&t=552s)
19
20
# Spring 에서 Async 사용을 위한 설정 방법
21
22
## 주의사항!!! ThreadPoolExecutor 를 꼭 설정하고 사용해야 함.
Mar 27, 2019
Mar 27, 2019
23
* 그렇지 않을 경우 Async 용 `SimpleAsyncTaskExecutor` 를 사용하도록 default 가 되어 있음.
24
25
## Srping Boot 2.1 에서의 ThreadPoolExecutor
26
27
* auto-configuration 으로 `ThreadPoolTaskExecutor` 를 생성해준다. [https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes) 참고
28
Nov 23, 2018
Nov 23, 2018
29
30
```
Mar 26, 2019
Mar 26, 2019
31
32
/**
33
* 1. CORE_POOL_SIZE 를 먼저 소비 한다.
34
* 2. CORE_POOL_SIZE 를 모두 점유 했다면, QUEUE_CAPACITY 값만큼 대기한다.
35
* 3. QUEUE_CAPACITY 도 다 찬다면, MAX_POOL_SIZE 만큼 THREAD 를 생성해서 처리한다.
36
* 주의!! 3가지의 설정을 적절히 해주어야 한다.
37
*/
38
private static final int CORE_POOL_SIZE = 100;
39
private static final int KEEP_ALIVE_SECONDS = 60;
40
private static final int MAX_POOL_SIZE = Integer.MAX_VALUE;
41
private static final int QUEUE_CAPACITY = Integer.MAX_VALUE;
42
private static final boolean WAIT_FOR_JOBS_TO_COMPLETE_ON_SHUTDOWN = true;
Mar 29, 2019
Mar 29, 2019
43
private static final int AWAIT_TERMINATION_SECONDS = 60; // 각 서비스에 맞는 적절한 값을 사용하도록 하자.
Mar 26, 2019
Mar 26, 2019
44
Nov 23, 2018
Nov 23, 2018
45
@Bean
46
@Primary
47
public ThreadPoolTaskExecutor adCenterTaskExecutor() {
48
49
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
50
51
threadPoolTaskExecutor.setThreadNamePrefix("AdCenter-");
52
threadPoolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
53
threadPoolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
54
threadPoolTaskExecutor.setQueueCapacity(QUEUE_CAPACITY);
55
threadPoolTaskExecutor.setKeepAliveSeconds(KEEP_ALIVE_SECONDS);
56
threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(WAIT_FOR_JOBS_TO_COMPLETE_ON_SHUTDOWN);
57
threadPoolTaskExecutor.setAwaitTerminationSeconds(AWAIT_TERMINATION_SECONDS);
Mar 29, 2019
Mar 29, 2019
58
threadPoolTaskExecutor.setBeanName("TaskExecutor Name");
Nov 23, 2018
Nov 23, 2018
59
60
return threadPoolTaskExecutor;
61
}
Mar 29, 2019
Mar 29, 2019
62
Nov 23, 2018
Nov 23, 2018
63
```
64
Mar 29, 2019
Mar 29, 2019
65
* ThreadPoolExecutor 를 사용한다면, 꼭 가장먼저 종료될수 있게 설정 해주는 게 좋다.
66
* 참고: [[BeanScope]] 의 `SmartLifecycle` 부분을 참고하도록 하자.
67
May 10, 2019
May 10, 2019
68
### ForkJoinPool
Nov 23, 2018
Nov 23, 2018
69
May 10, 2019
May 10, 2019
70
* [[Java] 쓰레드풀 과 ForkJoinPool](https://okky.kr/article/345720)
71