복붙노트

[SPRING] 봄 @Async 무시

SPRING

봄 @Async 무시

호출자가 외부 시스템으로부터 알림을받는 내장 라이브러리 인 경우 Spring에서 비동기 적으로 메소드를 호출하는 데 문제가 있습니다. 코드는 다음과 같습니다.

@Service
public class DefaultNotificationProcessor implements NotificationProcessor {

    private NotificationClient client;


    @Override
    public void process(Notification notification) {
        processAsync(notification);
    }

    @PostConstruct
    public void startClient() {
        client = new NotificationClient(this, clientPort);
        client.start(); 
    }

    @PreDestroy
    public void stopClient() {
        client.stop();
    }

    @Async
    private void processAsync(Notification notification) {
        // Heavy processing
    }
}

NotificationClient는 내부적으로 다른 시스템에서 알림을 수신하는 스레드를 가지고 있습니다. 기본적으로 알림의 실제 처리를 수행 할 객체 인 생성자에서 NotificationProcessor를 허용합니다.

위의 코드에서 Spring Bean을 프로세서로 제공하고 @Async 주석을 사용하여 비동기 적으로 알림을 처리하려고했습니다. 그러나 알림은 NotificationClient에서 사용하는 스레드와 동일한 스레드에서 처리됩니다. 사실, @Async는 무시됩니다.

내가 여기서 무엇을 놓치고 있니?

해결법

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

    1.실제 AspectJ 컴파일 타임이나 런타임 위젯을 사용하지 않는 한 @Async (@Async가 private 메소드 *에 사용될 때)를 통해 메소드가 호출되면 @Async (@Transactional 및 기타 유사한 주석)는 작동하지 않습니다.

    실제 AspectJ 컴파일 타임이나 런타임 위젯을 사용하지 않는 한 @Async (@Async가 private 메소드 *에 사용될 때)를 통해 메소드가 호출되면 @Async (@Transactional 및 기타 유사한 주석)는 작동하지 않습니다.

    * private 메소드의 경우 : 메소드가 private 인 경우, 이것을 통해 호출되어야합니다. - 그래서 이것이 결과적으로 더 큰 원인이됩니다

    코드를 변경하십시오.

    @Service
    public class DefaultNotificationProcessor implements NotificationProcessor {
    
    
        @Resource
        private DefaultNotificationProcessor selfReference;
    
    
        @Override
        public void process(Notification notification) {
            selfReference.processAsync(notification);
        }
    
    
        //the method must not been private
        //the method must been invoked via a bean reference
        @Async
        void processAsync(Notification notification) {
            // Heavy processing
        }
    }
    

    Spring @Transactional 속성은 private 메소드에서 작동합니까? - 이것은 같은 문제입니다.

  2. from https://stackoverflow.com/questions/22561775/spring-async-ignored by cc-by-sa and MIT license