我设计一个服务的门面,我有一个方法签名,看起来像这样:Hystrix fallback引发的捕获异常?
public Policy getPolicy(long policyId) throws PolicyNotFoundException
如果什么也没有发生,然后策略对象(POJO简单)被返回。如果未找到所请求的策略,则会引发检查异常PolicyNotFoundException(仅作为参考 - 当涉及应用程序内异常处理的最佳实践时,我们会遵循this article)。
服务门面层上方的层(在本例中为Spring MVC RestController)知道如何处理此类PolicyNotFoundException并返回适当的有效内容。
我试图做这样的事情纳入到HystrixCommand这样的:
@HystrixCommand(groupKey = "PolicyService", fallbackMethod = "getPolicySafe", ignoreExceptions = { PolicyNotFoundException.class })
public Policy getPolicy(long policyId) throws PolicyNotFoundException {
LOGGER.info("Getting policy {}", policyId);
// Simulate some error condition for testing purposes
throw new RuntimeException("Something happened!");
}
private Policy getPolicySafe(long policyId, Throwable t) throws PolicyNotFoundException {
LOGGER.warn("Falling back to circuit-breaker for getting policy {}", policyId, t);
throw new PolicyNotFoundException(policyId);
}
基本上我想要我的断路器简单地表现为,如果政策不是由原始的查询发现。我遇到的问题是,我从fallback方法抛出的异常在翻译的某处丢失。我在上面的图层中看到的异常是由命令方法抛出的RuntimeException,而不是fallback方法抛出的异常。有没有解决的办法?我不想更改原始方法的合同,也不希望上面的图层知道除了在未找到策略的情况下必须捕获PolicyNotFoundException之外的任何内容。无论这里需要什么,都应该在这个服务门面层中捕获。
任何和所有的帮助将不胜感激。谢谢!
对的,我理解这一点。有没有办法改变这种行为? – Eric
关于异常的讨论在这里https://github.com/Netflix/Hystrix/issues/1344 – spencergibb
感谢您的链接 - 我没有看到。虽然这是朝正确方向迈出的一步,但并未完全解决问题。应用程序的服务门面层就是所有这些hystrix“东西”都起作用的地方。此解决方案“污染”上面的图层并使服务外观层的调用者必须知道Hystrix所涉及的具体细节,方法是捕获HystrixRuntimeException,查找后备异常(通常为FallbackInvocationException),然后必须阅读由此引起的。 – Eric