Java Spring@Async被忽略
在Spring中,当调用程序是从外部系统接收通知的嵌入式库时,异步调用方法会遇到问题。代码如下所示:Java Spring@Async被忽略,java,spring,Java,Spring,在Spring中,当调用程序是从外部系统接收通知的嵌入式库时,异步调用方法会遇到问题。代码如下所示: @Service public class DefaultNotificationProcessor implements NotificationProcessor { private NotificationClient client; @Override public void process(Notification notification) {
@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
,该构造函数基本上就是实际处理通知的对象
在上面的代码中,我将Springbean作为处理器,并尝试使用@Async
注释异步处理通知。但是,通知似乎是在与NotificationClient
使用的线程相同的线程中处理的。实际上,@Async
被忽略
我错过了什么 @Async
(以及@Transactional
和其他类似注释)在通过调用该方法时将不起作用(当@Async
用于私有方法*)时启用),只要您不使用真正的AspectJ编译时或运行时编织
*私有方法是这样的:当方法是私有的时,它必须通过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
}
}
另请参见以下问题的答案:--这也是同样的问题代理无法处理内部调用。对异步方法的调用需要来自对代理的引用,而不是对实际对象的引用。是否可以在DefaultNotificationProcessor中自动连接DefaultNotificationProcessor?或者可以在注释为服务的类上执行此操作,因为当我使用组件注释时,它不起作用。@Marcinebel看一看:--抽象使用Spring 4.3或使用@Resource
而不是@Autowired
如果使用@Autowired
您还需要@Lazy
,否则您将创建一个依赖循环。