java - Spring @Async 被忽略

标签 java spring

当调用者是从外部系统接收通知的嵌入式库时,我在 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/

相关文章:

java - 以编程方式插入行(父行和子行)

java - 关于 Spring @Autowired 和 Spring JDBC 的问题

java - 如何在 Java 中比较字符串?

java - Java LinkedList API 不是多余的吗?

java - nexus 3 是否仍支持 osgi bundle 存储库 (obr)?

java - Apache Camel bean 参数与 Spring DSL 的绑定(bind)问题

java - Spring Security 用户详细信息最佳实践

java - 在 JTextPane 中更改文本光标大小

java - 在这段特定的代码中,浮点型还是整数型哪个更聪明?

java - 在 Spring 计划任务使用的 Bean 上使用 DAO