Java Spring@Async被忽略

Java Spring@Async被忽略,java,spring,Java,Spring,在Spring中,当调用程序是从外部系统接收通知的嵌入式库时,异步调用方法会遇到问题。代码如下所示: @Service public class DefaultNotificationProcessor implements NotificationProcessor { private NotificationClient client; @Override public void process(Notification notification) {

在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
,该构造函数基本上就是实际处理通知的对象

在上面的代码中,我将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
,否则您将创建一个依赖循环。