rabbitmq 进阶

1.备份交换器

目的:将未被路由的消息(没有匹配到队列的)放入一个单独的交换器

Eg:

Map<String, Object> args = new HashMap<String , Object>();
args.put("alternate-exchange" , "myAe");
channel.exchangeDeclare( "normalExchange" , "direct" , true , false , args);
channel.exchangeDeclare( "myAe" , "fanout" , true , false , null) ;
channel.queueDeclare( "normalQueue" , true , false , false , null);
channel.queueBind( "normalQueue" , "normalExchange" , "normalKey");
channel.queueDeclare( "unroutedQueue" , true , false , false , null);
channel.queueBind( "unroutedQueue", "myAe", "");

将mybe交换器设为备份交换器,路由键不是“normalKey”的发送到normalExchange后 会发给myae,进入到unroutedQueue队列

2.过期时间

2.1 消息过期:

设置队列的所有消息过期时间:

Map<String, Object> argss = new HashMap<String , Object>();
argss.put("x-message-ttl" , 6000);
channel.queueDeclare(queueName,durable,exclusive,autoDelete,argss);

设置单个消息的过期时间:(消费者使用前会判定是否过期)

AMQP.BasicProperties properties = new AMQP.BasicProperties() ;
properties.setDeliveryMode(2);
properties.setExpiration("60000");
channel.basicPublish(exchangeName , routingKey, mandatory , properties,"ttlTestMessage".getBytes());

2.2队列过期:(未被使用:没有任何消费者连接,也没有被重新声明,超过过期时间自动删除)

Map<String, Object> args =new HashMap<String, Object>{) ;
args.put( "x-expires" , 1800000);
channel.queueDeclare("myqueue" , false , false , false , args) ;

注:

1. 同时设置会取最小的值,超过过期时间,会变成Dead Message

2.TTL不设置表示不会过期,设置为0表示除非直接投递到消费者(没有消息在排队),否则立即丢弃

3 .死信交换器(DLX)

消息变成死信情况:

  • 消息被拒绝,且requeue为false(不重新放入队列直接丢弃)
  • 消息过期
  • 队列达到最大长度
// 定义死信交换器和死信队列
channel.exchangeDeclare("exchange.dlx" , "direct" , true);
channe1.queueDec1are( "queue.d1x" , true , false , false , null) ;
channel.queueBind( "queue.dlx" , "exchange.dlx" , "routingkey");

// 定义正常的交换器和队列
channel.exchangeDeclare( "exchange.normal" , "fanout" , true);
Map<String , Object> args = new HashMap<String, Object>( );
// 指定过期时间TTL
args.put( "x-message-ttl" , 10000);
// 指定死信交换器
args.put( "x-dead-letter-exchange" , "exchange.dlx");
// 指定死信队列
args.put( "x-dead-letter-routing-key" , "routingkey");
channe1.queueDec1are( "queue.normal" , true , false , false , args);
channe1.queueBind( "queue.normal" , "exchange.normal" , "");

// 发送消息到某个不存在的路由键 等待10秒超时后放入死信队列
channel.basicPublish( "exchange.normal" , "rk" ,MessageProperties.PERSISTENT_TEXT_PLAIN, "dlx".getBytes()) ;

应用:

  • 处理一些主动拒绝的或者异常的消息
  • DLX联合TTL可以实现延迟队列(即放入一个超时队列里,超时后放入死信队列在被消费者消费。比如30分钟内支付,没支付成功进行异常处理 ; 指定时间远程控制某个设备)

4 优先级队列

在消费速度小于生产速度时,优先级越高就越优先被消费

Map<String, Object> args = new HashMap<String, Object>() ;
args.put( "x-rnax-priority" , 10) ;
channel.queueDeclare( "queue.priority" , true , false , false , args) ;

猜你喜欢

转载自blog.csdn.net/qq_35720307/article/details/84953079