[컴][웹] Spring 의 thread 관련 정보

annotation / 어노테이션 /

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!!!!");
    }
}

See Also

  1. java - stopping ExecutorService Threads in Tomcat - Stack Overflow





댓글 없음:

댓글 쓰기