网站关键词选取的步骤,广告宣传片制作公司广告视频,产品推广方案范本3篇,常州网站建设解决方案1. 简介
1.1 DLX简介 DLX: Dead-Letter-Exchange 死信交换器#xff0c;死信邮箱 当消息成为Dead message后#xff0c;可以被重新发送到另一个交换机#xff0c;这个交换机就是DLX。 如下图所示#xff1a; 其实死信队列就是一个普通的交换机#xff0c;有些队列的消息…1. 简介
1.1 DLX简介 DLX: Dead-Letter-Exchange 死信交换器死信邮箱 当消息成为Dead message后可以被重新发送到另一个交换机这个交换机就是DLX。 如下图所示 其实死信队列就是一个普通的交换机有些队列的消息成为死信后比如过期了或者队列满了这些死信一般情况下是会被 RabbitMQ 清理的。但是你可以配置某个交换机为此队列的死信交换机该队列的消息成为死信后会被重新发送到此 DLX 。怎么处理这个DLX中的死信就是看具体的业务场景了DLX 中的信息可以被路由到新的队列。
2.2 出现死信的情况
队列长度到达限制无法加入新的消息消费者拒接消费消息并且不重回队列。该信息会被清除并进入死信队列原队列存在消息过期设置消息到达超时时间未被消费
2.3 代码示例
死信队列可以定义单条消息和整个队列死信分别是下方的2和4。
2.代码示例
以下定义了两个交换机分别是普通交换机和死信交换机定义了两个队列分别是普通队列和死信队列。
Configuration
public class RabbitConfig {final static String exchangeNormalName exchange.dlx.normal;final static String queueNormalName queue.dlx.normal;final static String exchangeDeadName exchange.dlx.dead;final static String queueDeadName queue.dlx.dead;//正常交换机Beanpublic DirectExchange normalExchange(){return ExchangeBuilder.directExchange(exchangeNormalName).build();}//正常队列Beanpublic Queue normalQueue(){MapString, Object map new HashMap();map.put(x-message-ttl, 20000);//设置20s的过期时间map.put(x-dead-letter-exchange, exchangeDeadName);//设置死信交换机名字map.put(x-dead-letter-routing-key, error);//设置死信交换机路由kreturn QueueBuilder.durable(queueNormalName).withArguments(map).build();}Beanpublic Binding normalBinding(DirectExchange normalExchange, Queue normalQueue){return BindingBuilder.bind(normalQueue).to(normalExchange).with(order);}//死信交换机Beanpublic DirectExchange dlxExchange(){return ExchangeBuilder.directExchange(exchangeDeadName).build();}//死信队列Beanpublic Queue dlxQueue(){return QueueBuilder.durable(queueDeadName).build();}Beanpublic Binding dlxBinding(DirectExchange dlxExchange, Queue dlxQueue){return BindingBuilder.bind(dlxQueue).to(dlxExchange).with(error);}}
如上设置普通交换机把过期内容放置到死信交换机中去。最重要的几行代码如下
map.put(“x-message-ttl”, 20000);//设置20s的过期时间map.put(“x-dead-letter-exchange”, exchangeDeadName);//设置死信交换机名字map.put(“x-dead-letter-routing-key”, “error”);//设置死信交换机路由key
3.测试结果 经过20s之后如下将普通队列的信息放入死信队列中 其中TTL代表x-message-ttlDLX代表x-dead-letter-exchangeDLK代表x-dead-letter-routing-key
4.单条消息
上方是将整个队列设置过期时间也可以将单条消息设置过期时间即不给整个队列设置过期时间 //map.put(x-message-ttl, 20000);//设置20s的过期时间map.put(x-dead-letter-exchange, exchangeDeadName);//设置死信交换机名字map.put(x-dead-letter-routing-key, error);//设置死信交换机路由k而是在消息体中设置过期时间
Component
Slf4j
public class MessageService {Autowiredprivate RabbitTemplate rabbitTemplate;public void senMsg() throws InterruptedException {//定义消息String msg单条消息过期时间test;MessageProperties messageProperties new MessageProperties();messageProperties.setExpiration(10000); //10sMessage message MessageBuilder.withBody(msg.getBytes()).andProperties(messageProperties).build();//发消息rabbitTemplate.convertAndSend(exchange.dlx.normal,order,message);log.info(消息发送完毕发送时间为:{}, new Date());}
}