gpt4 book ai didi

java - Spring @Async 被忽略

转载 作者:IT老高 更新时间:2023-10-28 13:54:28 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com