我是 Spring Boot 新手,正在尝试一个有趣的场景。我想返回执行一些 kafka 和rabbitMQ 发布的 api 和 post 的结果,并且我不希望我的 api 响应在我进行发布之前停止。我正在尝试使用
@EnableAsync
在应用程序中启用异步处理,并使用 @async
来定义我的方法。
@Async
fun publishOfferEventsAsync() {
Thread.sleep(10000)
// publish to rmq
logger().debug { "xxxyyyzzz" }
}
我可以直接从 bean 的其他非异步方法调用此异步执行吗? 有没有更好的方法可以推荐一下。 谢谢!
如果两者同步。和
@Async
定义在不同的对象中,没关系。
如果它们定义在同一个对象中,是不行的,因为
@Async
所基于的spring AOP不支持自调用。 (详情请参考这个)
如果确实需要在同一个对象中定义它们,您可以定义另一个通用的
@Async
执行器bean并调用async。通过它的方法。有喜欢的东西:
@Service
public class AsyncExecutor {
@Async
public <T> T execute(Supplier<T> action) {
return action.get();
}
@Async
public void execute(Runnable action) {
action.run();
}
}
然后注入即可使用:
@Service
public class FooService {
@Autowired
private AsyncExecutor asyncExecutor;
public void someSyncMethod(){
asyncExecutor.execute(()->publishOfferEventsAsync());
}
@Aysnc
public void publishOfferEventsAsync() {
...
}
}