RabbitMQPublisher有时无法恢复

kpbpu008  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(2)|浏览(155)

我正在使用Vertx 4.2.1和RabbitMQ客户端,我刚刚注意到,有时当RabbitMQ客户端失去连接并重新连接时,RabbitMQPublisher就不能再发布消息了。这意味着我对publisherClient.rxPublish(...)的调用永远不会完成,也不会抛出任何错误。
我的客户端设置为:

new RabbitMQOptions().setAutomaticRecoveryEnabled(true)
                    .setReconnectAttempts(0)
                    .setNetworkRecoveryInterval(1000L);

是否有一些设置或东西来防止这种情况?
目前,我正尝试使用以下解决方法来解决此问题:

publisherClient.rxPublish(......)
                    .timeout(5, TimeUnit.SECONDS)
                    .doOnError(err -> {
                        if (err instanceof TimeoutException) {
                            LOG.warn("Publisher did not recover, so it will be restarted");
                            publisherClient.restart();
                        }
                    })
                    .retry(1L, err -> err instanceof TimeoutException)

作为对该问题的一个小更新:这似乎是可重复的,如果我们试图在RabbitMQ连接断开时发布消息,即使连接恢复并且一切正常,我们也无法发布任何消息。对publisherClient.rxPublish(......)的调用永远不会完成
多谢帮忙

rqmkfv5c

rqmkfv5c1#

您如何测试它?您如何创建要发布到的交换和队列?
如果服务器返回时对象不在那里,那么所有消息将自动消失。为了创建对象,您需要使用连接建立的回调,这些回调当前无法通过Rx Package 器访问。

a8jjtwal

a8jjtwal2#

请尝试以下操作:

publisherClient.rxPublish(......)
  .timeout(5, TimeUnit.SECONDS)
  .doOnError(err -> {
      if (err instanceof TimeoutException) {
          LOG.warn("Publisher did not recover, so it will be restarted");
          publisherClient.restart();
      }
  })
  .retry(1L, err -> err instanceof TimeoutException)
  .subscribe()

相关问题