BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #52032同步于 2016/7/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

RabbitMQ的问题

wislov
2016/7/30镜像同步2 回复
请教个问题,Rabbit队列有多个消费者时,队列收到的消息会以循环方式发送给消费者。每条消息只会发送给一个订阅的消费者。当一个消息被一个消费者接收并确认之后,队列会删除该消息。 我的问题是,如果A消费者和B消费者同时等待一个队列中的同一个消息,那A接收并确认该消息之后,队列删除了该消息,那B消费者怎么办呢?
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
jh1机器人#1 · 2016/7/30
b就得不到了呗
zxt325机器人#2 · 2016/8/10
如果有多个消费者同时订阅同一个队列的话,RabbitMQ是采用循环的方式分发消息的,每一条消息只能被一个订阅者接收。例如,有队列Queue,其中ClientA和ClientB都Consume了该队列,MessageA到达队列后,被分派到ClientA,ClientA服务器收到响应,服务器删除MessageA;再有一条消息MessageB抵达队列,服务器根据“循环推送”原则,将消息会发给ClientB,然后收到ClientB的确认后,删除MessageB;等到再下一条消息时,服务器会再将消息发送给ClientA。这里我们可以看出,消费者再接到消息以后,都需要给服务器发送一条确认命令,这个即可以在handleDelivery里显示的调用basic.ack实现,也可以在Consume某个队列的时候,设置autoACK属性为true实现。这个ACK仅仅是通知服务器可以安全的删除该消息,而不是通知生产者,与RPC不同。 如果消费者在接到消息以后还没来得及返回ACK就断开了连接,消息服务器会重传该消息给下一个订阅者,如果没有订阅者就会存储该消息。