RabbtiMQ高级特性--消息投递机制

2019-08-18  本文已影响0人  叫我胖虎大人

Confirm确认消息

如何实现Confirm确认消息?


Return 消息机制

相关的API配置

在 基础API中有一个关键的配置项:
Mandatory:如果为true,则监听器会接收到路由不可达的消息,然后进行后续处理,如果为false,那么broker端自动删除该消息.

Return消息机制流程

找不到Exchange或者是找到了Exchange未找到RouteKey(简单点理解就是消息没有被发送到queue中[非故障情况下])


消费端的自定义监听

public class MyConsumer extends DefaultConsumer {


   public MyConsumer(Channel channel) {
      super(channel);
   }

   @Override
   public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
      System.err.println("-----------consume message----------");
      System.err.println("consumerTag: " + consumerTag);
      System.err.println("envelope: " + envelope);
      System.err.println("properties: " + properties);
      System.err.println("body: " + new String(body));
   }
}

通过继承DefaultConsumer来达到自定义消费操作
然后再Consumer类中使用basicConsume()方法的时候,使用自定义的Consumer方法

//这里就没有使用到了nextDelivery()方法,因为在自定义消费端中一样的具有接收body,在自定义的Consumer中也没有创建nextDelivery()方法
channel.basicConsume(queueName, true, new MyConsumer(channel));

消费端限流

什么是消费端限流

解决方案:RabbitMQ提供了一种qos(服务质量保证)功能,即在非自动确认消息的前提下,如果一定数目的消息,(通过基于Consume或者Chanel设置的Qos的值)未被确认前,不进行消费新的消息) 所以在实际的工作当中没有进行自动签收的操作,也就是autoAck设置为false
void BasicQos(unit prefetchSize,unshort prefetchCount,bool global)

消费端的ACK与重回队列

消费端可以进行手工ACK和NACK(不确认,表示失败)

消费端的重回队列:

在消息处于NAck的情况下,使用requeue为true,即重回队列 但是这个失败的消息,需要等队列中的消息发送完毕之后再进行

TTL消息

死信队列

消息变成死信的情况

死信队列的设置

然后进行正常声明交换机、队列、绑定,只不过需要在队列上加上一个参数:arguments.put("x-dead-letter-exchange","dlx.exchange);
这样消息在过期、requeue、队列达到最大长度时,消息就可以直接路由到死信队列


当这个队列的消息成为死信之后,就会把消息转发待死信队列当中 消息过期前,即未进入死信队列前
消息过期后,进入死信队列

参考课程:https://coding.imooc.com/class/262.html

上一篇 下一篇

猜你喜欢

热点阅读