์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- gradle
- java
- ๋ชฉ๋ก
- ์ฑ๊ธํค
- JAVA11
- codingtest
- css
- html
- StyleSheet
- Spring boot
- sql
- ์ํ๋ฆฌํฐ ๋ก๊ทธ์ธ
- ๋ก๊ทธ์ธ
- 2์ฐจ์๋ฐฐ์ด
- ์ฝ๋ฉํ ์คํธ
- programmers
- springSecurity
- ์ํ๋ฆฌํฐ๋ก๊ทธ์ธ
- ๋ฐ๋ณต๋ฌธ
- ์์คํธ๋ฆฌ
- javascript
- ์ํ๋ฆฌํฐ ๋ก๊ทธ์์
- springboot
- ์ํ๋ฆฌํฐ
- ํ๋ก๊ทธ๋๋จธ์ค
- ์คํ๋ง ๋ถํธ
- Linux
- inputํ๊ทธ
- security
- ๋ฆฌ๋ ์ค
- Today
- Total
JAVAIARY
๋น๋๊ธฐ ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ํ ThreadPoolTaskExecutor ๋ณธ๋ฌธ
๋น๋๊ธฐ ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ํ ThreadPoolTaskExecutor
shiherlis 2024. 1. 7. 15:241. ๋น๋๊ธฐ ์ ์ฉํ๊ธฐ
SpringBoot ํ๋ก์ ํธ์์๋ @EnableAsync ์ด๋ ธํ ์ด์ ์ ์ด์ฉํด์ ๊ฐ๋จํ๊ฒ ๋น๋๊ธฐ๋ฅผ ๊ตฌํํ ์ ์๋ค.
๋น๋๊ธฐ๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์๋ 2๊ฐ์ง๊ฐ ์๋ค.
1. SpringBootApplication ์ @EnableAsync ์ด๋
ธํ
์ด์
์ฌ์ฉํ๊ธฐ
2. AsyncConfig ์์ฑ (+@EnableAsync)
์ถ๊ฐ๋ก ์ํ๋ ๋ฉ์๋์ @Async ์ด๋ ธํ ์ด์ ์ ๋ฌ์์ฃผ๋ฉด ํด๋น ๋ฉ์๋๊ฐ ๋น๋๊ธฐ๋ก ์๋ํ๊ฒ ๋๋ค.
1) SpringBootApplication์ @EnableAsync
@EnableAsync
@SpringBootApplication
public class MyApplication {
์ดํ๋ฆฌ์ผ์ด์
์ @EnableAsync ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ง์ผ๋ก ๊ฐ๋จํ๊ฒ ๋น๋๊ธฐ๋ฅผ ๊ตฌํํ ์ ์๋ค.
ํ์ง๋ง ์ดํ๋ฆฌ์ผ์ด์
์ ์ง์ ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ ๊ฒฝ์ฐ, EnableAsync์ ๊ธฐ๋ณธ ์ค์ ์ผ๋ก ๋์์ ํ๊ฒ ๋๋ค.
taskExecutor๋ Executor bean์ ์ฐพ๋๋ฐ ์๋ค๋ฉด SimpleAsyncTaskExecutor๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋์ ๋๊ฐ๋ TaskExecutor ๋ฅผ ๋ฐ๋ก ๊ตฌํํด์ ์ฌ์ฉํ๊ฒ ๋๋ค.
2) AsyncConfig ํ์ผ ์์ฑ
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@EnableAsync
@Configuration
public class AsyncConfig {
private final int CORE_POOL_SIZE=3;
private final int MAX_POOL_SIZE = 10;
private int QUEUE_CAPACITY = 100_000;
@Bean(name = "task-executor")
public Executor threadPoolExecutor(){
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(CORE_POOL_SIZE); // core thread pool size
taskExecutor.setMaxPoolSize(MAX_POOL_SIZE); // ์์ฒญ queue size ์ด์์ผ ์ thread Pool size
taskExecutor.setQueueCapacity(QUEUE_CAPACITY); // core full์ผ ์ ๋๊ธฐ queue size
taskExecutor.setThreadNamePrefix("myExecutor");
return taskExecutor;
}
}
Configuration ์์ ์ฌ์ฉํ TaskExecutor์ property๋ฅผ ์ค์ ํด ์ค ์ ์๋ค.
์ ํ๋ ThreadPool ์ ์ฌ์ฉํ ๊ฒ์ด๋ฏ๋ก ThreadPoolTaskExecutor๋ฅผ ์ฌ์ฉํ์๋ค.
- CorePoolSize : 1. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋ ์ค๋ ๋ ํ ์ฌ์ด์ฆ
- MaxPoolSIze : 3. queue๋ ์ ๋ถ ์ฌ์ฉ์ค์ผ ๋ ์ถ๊ฐ์์ฒญ์ด ์ฌ ์ ์ฌ์ฉ๋๋ ์ค๋ ๋ ํ ์ฌ์ด์ฆ
- QueueCapacity : 2. ์ฝ์ด ์ค๋ ๋๊ฐ ์ ๋ถ ์ฌ์ฉ์ค์ผ ๋ ์์ (task)์ ๋๊ธฐ์์ผ๋๋ queue์ ์ฌ์ด์ฆ
๋ฉ์๋๋ฅผ ํธ์ถํด ์ฃผ๋ฉด ์ค์ ํด๋ ThreadNamePrefix์ ์ด๋ฆ์ ์ค๋ ๋๊ฐ ๋น๋๊ธฐ๋ก ๋์ํ๊ฒ ๋๋ค.
2. ๋น๋๊ธฐ ์ปค์คํ
1์์ ์ค์ ํด ์ค AsyncConfig ์์ฑํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋น๋๊ธฐ๋ฅผ ๊ตฌํํด ๋๊ณ ํ ์คํธ๋ฅผ ํ๋ ์์ค DB๊ฐ์ ๋ชป ๋ฐ์์ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. DB Schema ๋ฅผ ThreadLocal ์ ์ ์ฅํด ๋์๋๋ฐ ๋น๋๊ธฐ ์ค๋ ๋๋ก ์ฎ๊ฒจ์ ์คํํ๊ฒ ๋๋ฉด์ ๊ฐ์ ๋ถ๋ฌ์ค์ง ๋ชปํ๊ฒ ๋ ๊ฒ. ThreadLocal ์ฐธ์กฐ
๊ทธ๋์ TaskDecorator ์ธํฐํ์ด์ค๋ฅผ TaskDecoratorImpl ํด๋์ค๋ก ๊ตฌํํด์ฃผ์ด ์ด์ ์ค๋ ๋์ ์๋ DB์ ๋ณด๋ฅผ ์ ์์ ์ค๋ ๋์ ๋ณต์ฌํ ์ ์๋๋ก ํ๋ค.
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.task.TaskDecorator;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class TaskDecoratorImpl implements TaskDecorator {
@Override
public Runnable decorate(Runnable runnable) { //ThreadLocal ์ ๋ณด ๋น๋๊ธฐ์ค๋ ๋์ ๋ณต์ฌ
String schema = DBConfig.getDBSchema();
return ()-> {
DBConfig.addDBSchema(schema);
log.info("AsyncThread - DBConfig: "+DBConfig.getDBSchema());
runnable.run();
};
}
}
'lectureNote > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Collection Framework 02 - Stack/ Queue + DeQueue (0) | 2023.04.05 |
---|---|
Collection Framework 01 - LinkedList/ ArrayList (0) | 2023.04.05 |
JAVA ) 2์ฐจ์ ๋ฐฐ์ด ์ ์ธ , ์ด๊ธฐํ, ์ถ๋ ฅ (0) | 2023.03.04 |
๊ฐ๋น์ง ์ปฌ๋ ํฐ (0) | 2023.02.10 |
์๋ฐ ๊ธฐ๋ณธ (0) | 2023.02.10 |