春季@Async忽略

2022-09-02 23:42:28

我在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
    }
}

内部有一个线程,在该线程中,它从另一个系统接收通知。它在其构造函数中接受一个,该构造函数基本上是将执行通知实际处理的对象。NotificationClientNotificationProcessor

在上面的代码中,我已将Spring Bean作为处理器,并尝试使用注释异步处理通知。但是,通知似乎在与 使用的线程相同的线程中处理。实际上,被忽略了。@AsyncNotificationClient@Async

我在这里错过了什么?


答案 1

@Async当通过(on when 用于私有方法*)调用方法时,(以及其他类似的注释)将不起作用,只要您不使用真正的AspectJ编译时间或运行时编织。@Transactionalthis@Async

*私有方法是:当方法是私有的,那么它必须通过这个调用 - 所以这更多的是结果,然后是原因

因此,请更改代码:

@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属性是否适用于私有方法? - 这是相同的问题


答案 2

推荐