Spring MVC 从rest控制器返回一个API响应,然后进行一些处理,

kulphzqa  于 2023-10-24  发布在  Spring
关注(0)|答案(1)|浏览(129)

我是spring Boot 的新手,正在尝试一个有趣的场景。我想返回一个API的结果,并发布一些Kafka和rabbitMQ发布,我不想我的API响应停止,直到我发布的时候。我试图使用@EnableAsync来启用应用程序中的aprc处理,并使用@async来定义我的方法。

@Async
    fun publishOfferEventsAsync() {
        Thread.sleep(10000)
    // publish to rmq
        logger().debug { "xxxyyyzzz" }
    }

我可以直接从bean的其他非blog方法调用这个blog执行吗?你有更好的方法吗?谢谢!

w6lpcovy

w6lpcovy1#

如果sync.和@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() {
      ...
   }

}

相关问题