2015-09-28 20 views
8

Có cách nào để nhận được lý do không HystrixCommand không thành công khi sử dụng chú thích @HystrixCommand trong ứng dụng Khởi động mùa xuân? Dường như nếu bạn triển khai HystrixCommand của riêng mình, bạn có quyền truy cập vào getFailedExecutionException nhưng làm cách nào để bạn có thể truy cập vào điều này khi sử dụng chú thích? Tôi muốn có thể làm những việc khác nhau trong phương pháp dự phòng dựa trên loại ngoại lệ đã xảy ra. Điều này có thể không?Nhận ngoại lệ lỗi trong phương pháp @HystrixCommand dự phòng

Tôi đã thấy note về HystrixRequestContext.initializeContext() nhưng HystrixRequestContext không cung cấp cho bạn quyền truy cập vào bất kỳ thứ gì, có cách nào khác để sử dụng ngữ cảnh đó để truy cập ngoại lệ không?

Trả lời

7

tôi đã không tìm thấy một cách để có được ngoại lệ với chú thích một trong hai, nhưng tạo chỉ huy của riêng tôi làm việc cho tôi như vậy:

public static class DemoCommand extends HystrixCommand<String> { 

    protected DemoCommand() { 
     super(HystrixCommandGroupKey.Factory.asKey("Demo")); 
    } 

    @Override 
    protected String run() throws Exception { 
     throw new RuntimeException("failed!"); 
    } 

    @Override 
    protected String getFallback() { 
     System.out.println("Events (so far) in Fallback: " + getExecutionEvents()); 
     return getFailedExecutionException().getMessage(); 
    } 

} 

Hy vọng rằng đây sẽ giúp người khác là tốt.

2

tôi không thể tìm thấy một cách để có được những ngoại lệ với các chú thích, nhưng tôi thấy HystrixPlugins, với điều đó bạn có thể đăng ký một HystrixCommandExecutionHook và bạn có thể nhận được ngoại lệ chính xác ở chỗ như thế này:

HystrixPlugins.getInstance().registerCommandExecutionHook(new HystrixCommandExecutionHook() { 
      @Override 
      public <T> void onFallbackStart(final HystrixInvokable<T> commandInstance) { 

      } 
     }); 

Ví dụ lệnh là GenericCommand.

+0

Nhưng thông thường sẽ nắm bắt chúng trên mọi lần thực thi lệnh và sẽ không bị ràng buộc với lệnh thực thi cụ thể đúng không? Không hoàn toàn là những gì tôi đã theo đuổi, nhưng vẫn có thể hữu ích trong một số trường hợp bạn cần phải biết về những thất bại. –

24

Chỉ cần thêm thông số Throwable vào phương thức dự phòng và nó sẽ nhận được ngoại lệ mà lệnh gốc được tạo ra.

Từ https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica

@HystrixCommand(fallbackMethod = "fallback1") 
    User getUserById(String id) { 
     throw new RuntimeException("getUserById command failed"); 
    } 

    @HystrixCommand(fallbackMethod = "fallback2") 
    User fallback1(String id, Throwable e) { 
     assert "getUserById command failed".equals(e.getMessage()); 
     throw new RuntimeException("fallback1 failed"); 
    } 
1

Hầu hết thời gian chỉ sử dụng getFailedExecutionException(). GetMessage() đã cho tôi giá trị null.

Exception errorFromThrowable = getExceptionFromThrowable(getExecutionException()); 
    String errMessage = (errorFromThrowable != null) ? errorFromThrowable.getMessage() 

điều này mang lại cho tôi kết quả tốt hơn mọi lúc.

Các vấn đề liên quan