当调用者是从外部系统接收通知的嵌入式库时,我在 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
被忽略了。
我在这里缺少什么?
最佳答案
@Async
(以及@Transactional
等类似注解)在通过this
调用方法时将不起作用(on when @Async
用于私有(private)方法*),只要您不使用真正的 AspectJ 编译时或运行时编织。
*私有(private)方法的事情是:当方法是私有(private)的时,它必须通过 this
调用——所以这是结果而不是原因
所以改变你的代码:
@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
}
}
另见答案:Does Spring @Transactional attribute work on a private method? -- 这是同样的问题
关于java - Spring @Async 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22561775/