通过运行RabbitMQ使用者安全地结束Java应用程序的最佳方法是什么

Ton*_*rde 8 java rabbitmq

我们有一个独立的java应用程序在Debian机器上进行一些后台处理.它必须处理的作业是通过RabbitMQ消息发送的.

当需要升级java应用程序时,我们需要停止它(杀死它).但我们必须确保没有消费者正在处理消息.根据您的经验,实现这一目标的最佳方法是什么?

我们尝试向消费者发送'SHUTDOWN'消息,但我们似乎无法关闭队列或频道?!它冻结了应用程序!或者是否有另一种解决方案,我们可以自动关闭应用程序,而无需在linux中执行kill命令?

感谢分享你的经验.

问候

Bri*_*lly 4

RabbitMQ Java 库不提供(据我所知)任何在某些消息仍在处理时自动推迟消费者进程关闭的功能。因此,您必须自己完成此操作。

如果您的应用程序可以忍受,请关闭。此时尚未确认的任何消息都将保留在代理内的队列中,并在消费者恢复时重新传递。

如果您不能容忍这种情况,并且绝对必须确保所有正在进行的消息处理完成,那么您需要遵循与此答案中类似的建议,并在关闭处理程序中执行以下操作:

  1. 将“所有线程应该退出”标志设置为 true
  2. 加入线程池中的每个线程
  3. 优雅退出

这意味着每个消息处理线程(假设您有多个线程同时处理消息)需要遵循以下一般模式:

  1. 从队列中拉取一条消息并进行处理
  2. ack 刚刚处理完的消息
  3. 如果“所有线程应该退出”标志为 true,则退出线程函数
  4. 冲洗,重复

希望有帮助。