相关疑难解决方法(0)

RabbitMQ在"确认"模式下的通道行为

我在理解RabbitMQ的确认方面遇到了一些麻烦,我从RabbitMQ看到以下解释:

笔记

如果代理在将所述消息写入磁盘之前崩溃,则代理会丢失持久消息.在某些情况下,这会导致经纪人以令人惊讶的方式行事.例如,考虑这种情况:

  • 客户端将持久性消息发布到持久队列

  • 客户端使用队列中的消息(注意消息是持久的,队列是持久的),但还没有消息,

  • 经纪人去世并重新启动,并且

  • 客户端重新连接并开始使用消息.

此时,客户端可以合理地假设该消息将再次传递.情况并非如此:重启导致代理丢失消息.为了保证持久性,客户应该使用确认.如果发布者的频道处于确认模式,则发布者不会收到丢失消息的确认消息(因为消费者没有得到它并且没有写入磁盘).

然后我使用这个http://hg.rabbitmq.com/rabbitmq-java-client/file/default/test/src/com/rabbitmq/examples/ConfirmDontLoseMessages.java做一些基本测试并验证确认,但得到一些奇怪的结果:

  1. waitForConfirmsOrDie方法不会阻止生产者,这与我的期望不同,我想waitForConfirmsOrDie将阻止生成器,直到所有消息都被激活或其中一个消息被nack'd.
  2. 我从发布者中删除了channel.confirmSelect()和channel.waitForConfirmsOrDie(),并将使用者从auto ack更改为手动ack,我将所有消息发布到队列并逐个使用消息,然后我在停止期间停止rabbitmq服务器消费过程,我现在期望的是,在重启Rabbitmq服务器后,左侧消息将丢失,因为该通道未处于确认模式,但在服务器重启后仍然可以看到队列中的所有其他消息.

由于我是RabbitMQ的新手,任何人都可以告诉我,我对确认理解的问题在哪里?

rabbitmq

9
推荐指数
1
解决办法
7846
查看次数

标签 统计

rabbitmq ×1