【发布时间】:2018-03-21 03:21:56
【问题描述】:
我正在按照以下教程进行操作: https://www.rabbitmq.com/tutorials/tutorial-two-java.html.
我这样启动 RabbitMQ 服务器:
docker pull rabbitmq
docker run -d --hostname my-rabbit-host --name my-rabbit -p 5672:5672 rabbitmq:3
来自教程:
使用此代码,我们可以确定即使您使用 CTRL+C 在处理消息时,不会丢失任何内容。很快 工人死亡后,所有未确认的消息将被重新传递。
我产生了两个消费者,当我 CTRL+C 其中一个消费者时,另一个正在运行的消费者不收到原本发给前消费者的消息。如何在 CTRL+C 退出其中一位消费者后重新传递消息?
编辑:我现在正在通过“brew”安装 RabbitMQ,但我仍然看到同样的问题。
brew update
brew install rabbitmq
/usr/local/sbin/rabbitmq-server &
【问题讨论】:
-
根据您的描述,它应该可以开箱即用。您是否放置了睡眠而不是
doWork的东西并在睡眠期间停止了消费者? (显然,一旦消息被“basicAcked”,它就不会再次传递给任何消费者)。您确定其他消费者实际上正在消费吗? -
正确 - 我在 ack'ing 之前睡觉了。我在睡觉时按CTRL+C。我在消费者的 handleDelivery() 回调中打印消息,但它永远不会通过。
-
如果两个消费者都在消费,他们接收消息是均匀的,还是总是一样的接收消息?如果始终是同一个使用者,则可能表明第二个使用者未正确配置(例如,未正确绑定到队列)。为了更加自信,将一些消息放入队列并确保它们同时消费。另外,使用
rabbitmq:3-managementdocker image(+ forward 15672 并在浏览器中打开它,用户名是guest,密码是guest)来找出队列中消息的实际情况。 -
消费者以循环方式接收消息。出于某种原因,当我通过 Docker 安装时,mgmt 插件看不到任何活动连接或队列。我继续通过“brew”安装,现在 mgmt 插件页面看到了活动。但是,在缺少 CTRL+C 的确认后,消息仍然没有被重新传递。
标签: rabbitmq