从rest控制器返回api响应,然后进行一些异步处理

问题描述 投票:0回答:1

我是 Spring Boot 新手,正在尝试一个有趣的场景。我想返回执行一些 kafka 和rabbitMQ 发布的 api 和 post 的结果,并且我不希望我的 api 响应在我进行发布之前停止。我正在尝试使用

@EnableAsync
在应用程序中启用异步处理,并使用
@async
来定义我的方法。

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

我可以直接从 bean 的其他非异步方法调用此异步执行吗? 有没有更好的方法可以推荐一下。 谢谢!

spring-boot rest spring-mvc asynchronous
1个回答
0
投票

如果两者同步。和

@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() {
      ...
   }

}
© www.soinside.com 2019 - 2024. All rights reserved.