【发布时间】:2014-04-28 23:57:40
【问题描述】:
当调用者是从外部系统接收通知的嵌入式库时,我在 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 被忽略了。
我在这里缺少什么?
【问题讨论】:
-
代理不适用于内部呼叫。对异步方法的调用需要来自对代理的引用,而不是对实际对象的引用。