我们可以在@HystrixCommand上使用@Async吗?

时间:2017-05-23 16:43:48

标签: java spring-boot hystrix

我不知道如何测试这个并且需要快速回答是否有可能,我怎么可能测试这个。

所以我有一个来自服务的api-gateway调用,我想知道的是如果可以使用spring boot启用

@Component
class GatewayService {

      @Autowired
      private MicroserviceGateway microServiceGateway;

      @Async
      @HystrixCommand(threadPool = "microservice", groupKey = "microService", fallback = "getResponse2")
      private Future<ResponseDTO> getResponse(RequestDTO request) {
         try {
               ResponseDTO response = new APIRequest(endpoint, api).body(request).post();
               return new AsyncResult(response);
         } catch (Exception e) {
             throw new GatewayServiceException(e);
         }
      } 

      public Future<ResponseDTO> getResponse2(RequestDTO request) {
           return Futures.immediateFuture(RequestDTO.empty());
      }

}

后备会起作用吗?这一切都会异步吗?

编辑:试过这个,hystrix被忽略了,因为将来会立即返回。有什么工作吗?溶液

2 个答案:

答案 0 :(得分:2)

我认为使用线程池使用Hystrix命令asynchronously的方法是:

如果使用@HystrixCommand注释:

...
    @HystrixCommand
    public Future<Product> findProduct(String id) {
        return new AsyncResult<Product>() {

            @Override
            public Product invoke() {
                ...
                return productService.find ...
            }
        };
    }
...

如果使用Hystrix命令类,例如ProductCommandFind.java

...
        ProductCommandFind command = new ProductCommandFind(...);
        Future<Product> result = command.queue();
...

Hystrix命令使用自己的可配置线程池,可能为每个命令组配置一个线程池,假设一个命令组名为PRODUCT_GROUP的命令组的线程池:productCommandFind,productCommandCreate,....

基本上我认为不需要同时使用@Async@HystrixCommand注释方法。

答案 1 :(得分:0)

这应该有效。您的普通DTO方法将执行异步,在回退期间它将是同步的。