Java 立即关闭引发错误的RabbitMQ客户端进程是否合适?

Java 立即关闭引发错误的RabbitMQ客户端进程是否合适?,java,rabbitmq,Java,Rabbitmq,我有一个Java程序,它使用RabbitMQ Java客户端库读取和写入RabbitMQ队列 我正在考虑对进程应用立即关闭策略,即一旦库抛出异常,进程就会自动停止 从交付可靠性的角度来看,这会导致任何类型的问题吗 除了读/写方法引发的IOException、TimeoutException和interruptedeexception之外,客户端代码还可以通过异常处理程序(可以使用ConnectionFactory.setExceptionHandler()设置)处理一些异常情况 对于这个场景,请

我有一个Java程序,它使用RabbitMQ Java客户端库读取和写入RabbitMQ队列

我正在考虑对进程应用立即关闭策略,即一旦库抛出异常,进程就会自动停止

从交付可靠性的角度来看,这会导致任何类型的问题吗

除了读/写方法引发的
IOException
TimeoutException
interruptedeexception
之外,客户端代码还可以通过异常处理程序(可以使用
ConnectionFactory.setExceptionHandler()
设置)处理一些异常情况


对于这个场景,请考虑持久的(非瞬态)消息,并且每一个已发布的消息都必须被确认。

很难从这里列出的内容来确定,但是我鼓励您至少尝试区分永久性的、暂时性的和未知的错误。在第一种情况下,您需要立即启动监控系统,因为可能需要某种人为干预。对于第二种情况,您可以在短暂延迟后重试。最后,关闭客户端进程可能是最好的办法

在关闭客户端之前要考虑的一些事情,虽然:

  • 它是否有任何未完成的入站请求需要接收某种“错误”响应
  • 是否有一些国家需要保留
  • 是否真的没有更好的方法来恢复这种情况(例如,转储兔子连接并创建另一个)
  • 有多少其他机器正在打开兔子连接?如果它们都试图同时启动会发生什么情况(例如,它们是否都访问数据库、网络资源等)

对于数据完整性问题,您还需要考虑如何配置队列。如果队列本身被命名为持久队列,那么重新启动clint只意味着一些消息可能会累积一段时间,您将能够再次获取它们。否则,当连接断开时,队列将被删除,所有未送达的消息(或重新连接前发布的新消息)将丢失。

谢谢您的输入。我忘了提到持续排队。目前没有关于这些考虑因素的顾虑,因此关闭流程是可以的。我想知道Java客户端是否可以保持一些内部状态,如果JVM突然停止,可能会导致问题。明白了。我没有专门使用Java客户机,所以我不能对这部分内容发表评论。我使用过的Django和iOS客户端都没有这样的问题,FWIW…我不明白为什么人们会因为基于观点而投票关闭。从我的理解来看,这是非常客观的,使用Java客户机这种方法可能会导致问题,也可能不会。