微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何根据条件跳过 vertx 断路器中的重试

如何解决如何根据条件跳过 vertx 断路器中的重试

我目前正在使用 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. 停止重试的方法
  3. 增加失败的方法

更新 1 ---------------------

我自己实现了重试部分,为了使操作超时,我可以设置计时器并检查操作状态,如果操作未完成,我可以启动重试逻辑。 但是我不知道如何在重试下一个之前取消操作,例如如何取消事件总线请求?

更新 2 -----------------

Vertx 断路器也不处理超时操作。我可以在重试过程中看到来自事件总线的旧响应。如果处理不当,这可能会混淆应用程序逻辑。

解决方法

Vert.x Circuit Breaker API 当前不支持此功能。有一个 open issue about it here。还有一个 PR 试图修复它,但它已经存在了一年。不知道为什么它从来没有被审查过。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。