如何根据条件跳过vertx断路器中的重试
How to skip retry in vertx circuit breaker based on condition
我目前正在使用 Vertx
CircuitBreaker
尝试重试请求事件总线。基于 ReplyException.ReplyFailure
我想跳过或避免重试。
例如,当事件总线以 ReplyFailure.RECIPIENT_FAILURE
响应时,我不想重试,因为这种错误不是应用程序错误,而是逻辑验证失败。
下面是我的代码,
CircuitBreaker breaker = CircuitBreaker.create("my-circuit-breaker", vertx,
new CircuitBreakerOptions()
.setMaxFailures(2)
.setTimeout(5 * 1000)
.setFallbackOnFailure(true)
.setResetTimeout(5000)
.setMaxRetries(2)
).retryPolicy(retryCount -> retryCount * 5000L);
使用断路器如下,
breaker.execute(promise -> {
vertx.eventBus().<JsonObject>request(address, jsonObject, deliveryOptions)
.onComplete(event -> {
基于事件我不想断路器放弃重试。我尝试检查事件状态,然后使用异常调用 promise.complete 方法,尽管断路器将其识别为失败并开始重试。如何告诉断路器停止重试?
我认为断路器对象可能有
- 关闭它的方法
- 一种停止重试的方法
- 一种增加失败的方法
更新 1 ----------------------
我已经自己实现了重试部分,为了让操作超时,我可以设置定时器并检查操作的状态,如果操作没有完成我可以启动重试逻辑。
但是我不知道如何在重试下一个操作之前取消操作,例如如何取消事件总线请求?
更新 2 ------------------
Vertx 断路器也未处理超时操作。在重试过程中,我可以看到来自事件总线的旧响应。如果处理不当,这可能会混淆应用程序逻辑。
Vert.x 断路器 API 当前不支持此功能。有一个open issue about it here。还有一个 PR 试图修复它,但它已经存在一年了。不知道为什么它从未得到审查。
我目前正在使用 Vertx
CircuitBreaker
尝试重试请求事件总线。基于 ReplyException.ReplyFailure
我想跳过或避免重试。
例如,当事件总线以 ReplyFailure.RECIPIENT_FAILURE
响应时,我不想重试,因为这种错误不是应用程序错误,而是逻辑验证失败。
下面是我的代码,
CircuitBreaker breaker = CircuitBreaker.create("my-circuit-breaker", vertx,
new CircuitBreakerOptions()
.setMaxFailures(2)
.setTimeout(5 * 1000)
.setFallbackOnFailure(true)
.setResetTimeout(5000)
.setMaxRetries(2)
).retryPolicy(retryCount -> retryCount * 5000L);
使用断路器如下,
breaker.execute(promise -> {
vertx.eventBus().<JsonObject>request(address, jsonObject, deliveryOptions)
.onComplete(event -> {
基于事件我不想断路器放弃重试。我尝试检查事件状态,然后使用异常调用 promise.complete 方法,尽管断路器将其识别为失败并开始重试。如何告诉断路器停止重试?
我认为断路器对象可能有
- 关闭它的方法
- 一种停止重试的方法
- 一种增加失败的方法
更新 1 ----------------------
我已经自己实现了重试部分,为了让操作超时,我可以设置定时器并检查操作的状态,如果操作没有完成我可以启动重试逻辑。 但是我不知道如何在重试下一个操作之前取消操作,例如如何取消事件总线请求?
更新 2 ------------------
Vertx 断路器也未处理超时操作。在重试过程中,我可以看到来自事件总线的旧响应。如果处理不当,这可能会混淆应用程序逻辑。
Vert.x 断路器 API 当前不支持此功能。有一个open issue about it here。还有一个 PR 试图修复它,但它已经存在一年了。不知道为什么它从未得到审查。