복붙노트

[SPRING] 비동기 스프링에 여러 threadPoolExecutor를 사용하는 방법

SPRING

비동기 스프링에 여러 threadPoolExecutor를 사용하는 방법

두 클래스에서 Spring @Async를 사용하고 있습니다. 둘 다 궁극적으로 인터페이스를 구현하고 있습니다. 두 개의 개별 ThreadPoolTaskExecutor를 만들고 있으므로 각 클래스에는 고유의 ThreadPool이 있습니다. 그러나 프록시가있는 것으로 생각하고 Spring이 비동기 클래스를 구현하는 방법 때문에 @Async 주석을 기본 인터페이스에 넣어야합니다. 이로 인해 두 클래스 모두 동일한 ThreadPoolTaskExecutor를 사용하게됩니다. 이 Bean에 대해 (이 경우 해당 인터페이스를 서비스를 구현하는 클래스를 호출하고 있음) Spring에 말할 수 있습니까?이 ThreadPoolTaskExecutor를 사용하십시오.

해결법

  1. ==============================

    1.메소드에서 @Async를 지정할 때 기본적으로 사용될 실행 프로그램은 여기에 설명 된대로 '주석 구동'요소에 제공되는 실행 프로그램입니다.

    메소드에서 @Async를 지정할 때 기본적으로 사용될 실행 프로그램은 여기에 설명 된대로 '주석 구동'요소에 제공되는 실행 프로그램입니다.

    그러나 @Async 어노테이션의 value 속성은 지정된 메소드를 실행할 때 기본값 이외의 실행 프로그램을 사용해야 함을 표시해야 할 때 사용할 수 있습니다.

    @Async("otherExecutor")
    void doSomething(String s) {
        // this will be executed asynchronously by "otherExecutor"
    }
    

    이 경우 "otherExecutor"는 Spring 컨테이너에있는 Executor Bean의 이름이거나, 또는 Executor와 연관된 규정 자의 이름 일 수 있습니다 (예 : 요소 또는 Spring의 @Qualifier 주석으로 지정된

    https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

    그리고 원하는 풀 설정으로 앱에서 otherExecutor bean을 지정해야 할 수도 있습니다.

    @Bean
    public TaskExecutor otherExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
    
        return executor;
    }
    
  2. from https://stackoverflow.com/questions/45776483/how-to-use-multiple-threadpoolexecutor-for-async-spring by cc-by-sa and MIT license