Spring 의 thread 관련
@ControllerAdvice
기본적으로 @ControllerAdvice 는 모든 controller 에서 접근가능하다.
@ModelAttribute
@ModelAttribute
는 @RequestMapping 이전에 실행된다.AsyncConfigurer class
AsyncConfigurer 를 상속하고,@EnableAsync
anootation 을 사용해서, the Executor instance 를 customize 할 수 있다. Executor instance 는 async method 를 호출을 처리 한다(thread 를 만들어서 처리한다.). 주로 AsyncConfigurerSupport 를 사용하면 된다.
예시
@Configuration @EnableAsync(proxyTargetClass = true) @EnableScheduling public class AsyncConfiguration extends AsyncConfigurerSupport { // `@Autowired` 에 의해 `threadPoolTaskExecutor` 에 bind 된다.? @Autowired private ThreadPoolTaskExecutor threadPoolTaskExecutor; ... // 그래서 `@Resource(name = "secondThreadRun")` 에 의해서 // `secondThreadRun` 에 bind 된다. 이때 `secondThreadRun` 은 // `ApplicationContextTestResourceNameType application context` 에 // define 되어야 한다. @Resource(name = "secondThread") private ThreadPoolTaskExecutor secondThread; @Override public Executor getAsyncExecutor() { return threadPoolTaskExecutor; } ... @Bean(destroyMethod = "shutdown") public ThreadPoolTaskExecutor threadPoolTaskExecutor() { // `@Bean` 을 creation 을 하고, `threadPoolTaskExecutor` 이름으로 // Bean 이 하나 생성되고, // 이것이 `@Autowired` 에 의해 `threadPoolTaskExecutor` 에 bind 된다.? ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(10); executor.setQueueCapacity(50); executor.setThreadNamePrefix("mythread-"); executor.initialize(); return executor; } /** * `createSecondThreadPool` 의 bean 은 `secondThread` 라는 이름으로 생성된다. * * @return */ @Bean(name = "secondThread") @Qualifier public Executor createSecondThreadPool() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(TASK_BATCH_CORE_POOL_SIZE); executor.setMaxPoolSize(TASK_BATCH_MAX_POOL_SIZE); executor.setQueueCapacity(TASK_BATCH_QUEUE_CAPACITY); executor.setBeanName(EXECUTOR_BATCH_BEAN_NAME); executor.initialize(); return executor; } }
@Service public class NhBatchThreadRun { ... @Autowired MyService1 myService1; @Autowired MyService2 myService2; /** * `@Async("secondThread")` 는 `secondThread` 라는 * name 의 bean 을 이용한다. * 이 bean 은 configuration class 에 정의되어 있어야 한다. * (`AsyncConfiguration.createSecondThreadPool` 를 확인하자.) * * `secondThread` executor 가 `secondThreadRun` 를 실행하게 된다. * * @ref: [How To Do @Async in Spring | Baeldung](https://www.baeldung.com/spring-async) * * @param str */ @Async("secondThread") public void secondThreadRun(String str) { logger.debug("THREAD START!!!"); // batch Start!! try { while(!Thread.interrupted()) { logger.debug("THREAD ING!!!! "+new Date().toString()); myService1.send(); myService2.insertIntoDB(); ... Thread.sleep(1000 * 5); } } catch (InterruptedException e) { e.printStackTrace(); } logger.debug("THREAD END!!!!"); } }
댓글 없음:
댓글 쓰기