java - 使用正在运行的 RabbitMQ 消费者安全结束 Java 应用程序的最佳方法是什么

标签 java rabbitmq

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

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

我们试图向消费者发送“SHUTDOWN”消息,但我们似乎无法关闭队列或 channel ?!它卡住了应用程序! 或者是否有另一种解决方案,例如我们可以在不执行 linux 中的 kill 命令的情况下自动关闭应用程序?

感谢分享您的经验。

问候

最佳答案

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

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

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

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

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

  1. 从队列中取出一条消息并处理它
  2. 确认刚刚处理的消息
  3. 如果“所有线程都应该退出”标志为真,则退出线程函数
  4. 冲洗,重复

希望对您有所帮助。

关于java - 使用正在运行的 RabbitMQ 消费者安全结束 Java 应用程序的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6699669/

相关文章:

java - 如何在屏幕上只显示 map 的一部分

java - 如何确保我的应用程序与 RabbitMQ 的连接是健康的?

java - RabbitMQ (Java) 多消费者性能问题

scala - 使用 Akka Actors 的 OutOfMemoryError

rabbitmq - 如何重启RabbitMQ服务

go - 在 nack 卡住我的应用程序之前删除队列

java - Spring Security getAuthenticationManager() 在自定义过滤器中返回 null

java - 如何将 Ruby 脚本与我的 JAR 捆绑在一起并调用它们

java - Java HashMap 是否要求值不可变?

使用非常小的代码时,Java-Image 不会绘制到屏幕上