我有一些很难理解的RabbitMQ的确认,我看到了下面从RabbitMQ的解释:行为“确认”模式的RabbitMQ渠道
注
经纪人失去,如果持久性消息在所述 消息被写入磁盘之前它崩溃。在某些情况下,这会导致经纪人以令人惊讶的方式行事。例如,考虑这个 场景:
客户端发布的持久消息持久的队列
客户端从队列中消耗消息(指出消息是持久性和队列耐用) ,但还没有确认它,
经纪人死了,被重新启动,
客户端重新连接并开始消费消息。
此时,客户可以合理地认为消息 将再次发送。情况并非如此:重新启动导致代理丢失信息 。为了保证持久性,一个 客户端应该使用确认。如果发布者的通道已经在 确认模式,出版商也不会接收到 失去消息的ACK(因为消费者没有ack'd它,它一直没 写入到磁盘)。
然后我用这http://hg.rabbitmq.com/rabbitmq-java-client/file/default/test/src/com/rabbitmq/examples/ConfirmDontLoseMessages.java做一些基本的测试和验证确认,但得到一些奇怪的结果:
- 的waitForConfirmsOrDie方法不会阻止制片人,这是我的预期不同,我想waitForConfirmsOrDie会阻止生产者,直到所有的消息被删除或者其中一个消息被删除。
- 我从发布者中删除了channel.confirmSelect()和channel.waitForConfirmsOrDie(),并将消费者从auto ack更改为手动ack,我将所有消息发布到队列并逐个使用消息,然后停止rabbitmq服务器在消耗过程中,我现在期望的是在rabbitmq服务器重新启动后,左边的消息将会丢失,因为通道不处于确认模式,但在服务器重新启动后仍然可以看到队列中的所有其他消息。
因为我是RabbitMQ的新手,谁能告诉我我的确认问题在哪里?