RabbitMQ 学习初入门(5)

【1】 消息MESSAGE_A 到达 queue_A 队列
【2】 RabbitMQ 把 MESSAGE_A 发送到 APPLICATION A(消费者)
【3】 APPLICATION A 确定收到了消息 发个ack 高兴一下
【4】 RabbitMQ 把 消息从 queue_A 队列删除。

上面其实也有说过,autoack参数 有印象吧~ 所以autoack 设置成true 就没错了。这里就可以开展其他话题了,如果多个订阅者怎么办呢,是不是多个订阅者都会收到消息呢,答案是否定的。RabbitMQ的队列会对订阅者做一个循环,例如目前有两个订阅者订阅了同一个队列,serverA 和 serverB 他会循环去发送消息,队列有 ID 1-10 的消息,ID 1消息会由 serverA 处理 ID 2 消息会由 serverB 处理 ID 3 消息会由 serverA 去处理 如此类推。
如果serverA 在发送ACK应答给 RabbitMQ之前 断开连接【就是服务挂了,宕机了】RabbitMQ 会认为这个消息没有处理,即没有消费到这个消息,会把这个消息发送到 serverB 去处理。
而且在消息没有ACK之前,RabbitMQ不会发你第二条消息的,所以如果你想等待消息的任务处理完之后再给第二个消息的话,可以将autoDelete设置成false,这样你就可以在消息处理完之后再去ack。���样也是一个非常通用的场景,以防扎堆处理消息。
其实这样的设计也是非常好的,如果你出现了业务错误,执行消息处理的时候,刚好出现问题了,你可以通过断开连接的方式【这里所指的断开是断开RabbitMQ的connection】让这个消息交给下个订阅者,【这里说一下,如果队列没有消费者去订阅消息的话,消息会存在RabbitMQ当中等待有消费者去订阅再去发送】,当然这也是在你没有ack的情况下。在高级版本的RabbitMQ中可以使用reject命令,让这个消息直接传递到下个订阅者。【在RabbitMQ2.0可以使用】

AMQP信道channel与订阅

如果 一个channel 订阅了一个队列就不能订阅别的队列了,也就是说一个channel只能订阅一个队列。所以你需要取消原来的订阅,并将信道设置为“传输”模式。后面有时间写后面的文章可能会说到。

交换器的类型:

direct :这个简单,只要路由键一模一样就投递到相应的队列当中。

fanout :这个也简单,消息会投递到所有绑定到这个交换器的队列当中。

topic :这个就复杂一点了,我很客观的简单就简单 复杂就复杂 从不忽悠。但是这个也好常用不能不学,好累。在路由键当中可以使用通配符。怎么说呢,好纠结啊 不知道怎么解释啊 怎么办 在线等。

举个例子吧,绑定队列:

//绑定队列 路由键是 tony.teamA 有路由键为tony.teamA的消息就投递到这里 this.channel.queueBind("queueA","topic_exchangeA","tony.teamA",null); //绑定队列 路由键是 yan.teamA 有路由键为tony.teamB的消息就投递到这里 this.channel.queueBind("queueB","topic_exchangeA","yan.teamA",null); //绑定队列 路由键是 *.teamA 有路由键为.teamA结尾的消息就投递到这里 this.channel.queueBind("queueC","topic_exchangeA","*.teamA",null); //绑定队列 路由键是 chao.teamB 有路由键为chao.teamB的消息就投递到这里 this.channel.queueBind("queueD","topic_exchangeA","chao.teamB",null); //绑定队列 路由键是 *.teamB 有路由键为.teamB结尾的消息就投递到这里 this.channel.queueBind("queueE","topic_exchangeA","*.teamB",null); //绑定队列 路由键是 # 所有在这个交换器的消息都投递到这里 this.channel.queueBind("queueF","topic_exchangeA","#",null); // queueA[路由键:tony.teamA]、queueC[路由键:*.teamA]、queueF[路由键:#]会收到消息 this.channel.basicPublish("topic_exchangeA","tony.teamA",properties,SerializationUtils.serialize(msg)); // queueD[路由键:chao.teamB]、queueE[路由键:*.teamB]、queueF[路由键:#]会收到消息 this.channel.basicPublish("topic_exchangeA","chao.teamB",properties,SerializationUtils.serialize(msg));

然后基本的rabbitMQ 的东西就搞好了。不过这只是开始~

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14812.html