[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.실제 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 메소드에서 작동합니까? - 이것은 같은 문제입니다.
from https://stackoverflow.com/questions/22561775/spring-async-ignored by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @PersistenceContext Spring 및 Java EE의 EntityManager 스레드 안전성 (0) | 2019.03.26 |
---|---|
[SPRING] 스프링 데이터 JPA CRUDRepository에 캐시 기능을 추가하는 방법 (0) | 2019.03.26 |
[SPRING] 스프링 빈에서는 트랜잭션을 사용할 수있는 시스템 종료 방법을 사용할 수 있습니까? (0) | 2019.03.26 |
[SPRING] 내 Angular + Spring 응용 프로그램 라우팅은 TomCat에 배포 할 때 작동하지 않습니다. (0) | 2019.03.26 |
[SPRING] RestTemplate을 사용하여 HTTP로 헤더 가져 오기 (0) | 2019.03.26 |