2016-08-17 15 views
10

Tôi có một khách hàng giả vờ với cuộc gọi bên ngoài này:Tôi có thể ném lỗi tùy chỉnh nếu thời gian gọi được bảo vệ bằng hystrix không?

@RequestMapping(method = RequestMethod.GET, value = "GetResourceA", consumes = "application/json") 
@Cacheable("ResourceA") 
List<Stop> getResourceA() throws MyOwnException; 

Và trong tôi application.yml Tôi có cài đặt này:

hystrix: 
    command: 
    default: 
     execution.isolation.thread.timeoutInMilliseconds: 1000 
     fallback.enabled: false 

Bây giờ nếu getResourceA lần ra ngoài, tức là nó phải mất hơn một giây để hoàn thành , Tôi có thể nhận được điều này:

com.netflix.hystrix.exception.HystrixRuntimeException: getResourceA timed-out and no fallback available 

Hoặc, nếu tôi xác định một dự phòng mà tôi ném ngoại lệ của riêng mình, tôi nhận được điều này:

com.netflix.hystrix.exception.HystrixRuntimeException: getResourceA timed-out and fallback failed. 

Tôi không thể ném ngoại lệ của riêng mình khỏi dự phòng?

Nếu tôi muốn ném ngoại lệ của riêng mình khi dịch vụ ngừng hoạt động thì sao? Tôi không muốn có một dự phòng (vì tôi không có giá trị hợp lý để quay trở lại từ dự phòng), nhưng thay vào đó hãy ném lỗi của riêng tôi mà tôi có thể bắt và để chương trình tiếp tục. Ai đó có thể giúp tôi với điều này?

Cập nhật sau câu trả lời từ Ben:

Vì vậy, tôi cố gắng tiếp cận với bắt HysterixRuntimeException và kiểm tra những gì gây ra nó, nhưng kết thúc với mã xấu xí này:

try { 
    getResourceA(); 
} catch (HystrixRuntimeException e) { 
    if (e.getFailureType().name().equals("TIMEOUT")) { 
     throw new MyOwnException("Service timed out"); 
    } 
    throw e; 
} 

Tất cả những gì được có thể ném MyOwnException vào một thời gian chờ. Chắc chắn phải có một cách khác?

Trả lời

1

Bạn sẽ có thể để có được ngoại trừ bạn ném từ dự phòng của bạn bằng cách nhận được nguyên nhân của HystrixRuntimeException

Vì vậy, để xử lý ngoại lệ tùy chỉnh, bạn có thể làm điều này:

try { 
    getResourceA(); 
} catch (HystrixRuntimeException e) { 
    if (e.getCause() instanceof MyException) { 
     handleException((MyException)e.getCause()); 
    } 
} 
+0

Cảm ơn! Đó là những gì tôi sẽ làm trừ khi có một cách khác mà không yêu cầu tôi để bắt (xấu xí) HystrixRuntimeException trong "mã của riêng tôi". – L42

+0

@ L42. Không vấn đề gì. Tôi đã gặp vấn đề tương tự vào năm ngoái, và đây sẽ là điều tốt nhất tôi có thể tìm thấy. Sẽ được quan tâm để xem nếu có ai khác có một gợi ý tốt hơn tôi có thể sử dụng để dọn dẹp những thứ lên một chút :) –

+0

Tôi đã thử nó và cuối cùng phải làm như sau để lấy ngoại lệ tôi ném trong phương pháp dự phòng: http: //pastebin.com/Dxw95kSB. Bạn có biết cách tốt hơn để làm điều đó không? – L42

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