当前位置: 首页 > news >正文

湖南郴州建设局网站电脑网站开发者模式

湖南郴州建设局网站,电脑网站开发者模式,做面包的网站,几千元的网站建设目录 一、概念 二、出现死信的原因 三、实战 (一)代码架构图 (二)消息被拒 (三)消息TTL过期 (四)队列达到最大长度 一、概念 先从概念解释上搞清楚这个定义,死信&…

目录

一、概念

二、出现死信的原因

三、实战

(一)代码架构图

(二)消息被拒

(三)消息TTL过期

(四)队列达到最大长度


一、概念

先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理
解,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列。
应用场景:为了保证订单业务的消息数据不丢失,需要使用到 RabbitMQ 的死信队列机制,当消息
消费发生异常时,将消息投入死信队列中.还有比如说: 用户在商城下单成功并点击去支付后在指定时间未支付时自动失效

二、出现死信的原因

  • 消息 TTL 过期
  • 队列达到最大长度(队列满了,无法再添加数据到 mq )
  • 消息被拒绝(basic.reject basic.nack)并且 requeue=false.

三、实战

(一)代码架构图

 

(二)消息被拒

生产者

public class Producer {public static final String NORMAL_EXCHANGE = "normal_exchange";public static void main(String[] args) throws IOException {Channel channel = RabbitMqUtils.getChannel();for (int i = 0; i < 10; i++) {String message = "info" + i;channel.basicPublish(NORMAL_EXCHANGE, "zhangsan", null, message.getBytes());}}
}
C1 消费者代码(启动之后关闭该消费者 模拟其接收不到消息)
public class Consumer01 {public static final String NORMAL_QUEUE = "normal_queue";public static final String NORMAL_EXCHANGE = "normal_exchange";public static final String DEAD_QUEUE = "dead_queue";public static final String DEAD_EXCHANGE = "dead_exchange";public static void main(String[] args) throws IOException {Channel channel = RabbitMqUtils.getChannel();// 声明普通和死信交换机channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);// 声明死信队列channel.queueDeclare(DEAD_QUEUE, false, false, false, null);// 死信的绑定channel.queueBind(DEAD_QUEUE, DEAD_EXCHANGE, "lisi");Map<String, Object> arguments = new HashMap<>();// 普通队列设置对应的交换机arguments.put("x-dead-letter-exchange", DEAD_EXCHANGE);// 设置死信队列的RouteKeyarguments.put("x-dead-letter-routing-key", "lisi");// 设置队列最大长度arguments.put("x-max-length", 6);// 声明普通队列channel.queueDeclare(NORMAL_QUEUE, false, false, false, arguments);// 普通的绑定channel.queueBind(NORMAL_QUEUE, NORMAL_EXCHANGE, "zhangsan");DeliverCallback deliverCallback = (consumerTag, message) -> {String msg = new String(message.getBody());if (msg.equals("info5")) {System.out.println("Consumer01接收到消息" + message + "并拒绝签收该消息");channel.basicReject(message.getEnvelope().getDeliveryTag(), false);} else {System.out.println("consumer01接收到消息:" + msg);channel.basicAck(message.getEnvelope().getDeliveryTag(), false);}};channel.basicConsume(NORMAL_QUEUE, false, deliverCallback, consumerTag -> {});}
}

C2 消费者代码不变
启动消费者 1 然后再启动消费者 2

 

 

(三)消息TTL过期

生产者代码
public class Producer {public static final String NORMAL_EXCHANGE = "normal_exchange";public static void main(String[] args) throws IOException {Channel channel = RabbitMqUtils.getChannel();AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().expiration("10000").build();for (int i = 0; i < 10; i++) {String message = "info" + i;channel.basicPublish(NORMAL_EXCHANGE, "zhangsan", properties, message.getBytes());}}
}
消费者 C1 代码(启动之后关闭该消费者 模拟其接收不到消息)
public class Consumer01 {public static final String NORMAL_QUEUE = "normal_queue";public static final String NORMAL_EXCHANGE = "normal_exchange";public static final String DEAD_QUEUE = "dead_queue";public static final String DEAD_EXCHANGE = "dead_exchange";public static void main(String[] args) throws IOException {Channel channel = RabbitMqUtils.getChannel();// 声明普通和死信交换机channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);// 声明死信队列channel.queueDeclare(DEAD_QUEUE, false, false, false, null);// 死信的绑定channel.queueBind(DEAD_QUEUE, DEAD_EXCHANGE, "lisi");Map<String, Object> arguments = new HashMap<>();// 普通队列设置对应的交换机arguments.put("x-dead-letter-exchange", DEAD_EXCHANGE);// 设置死信队列的RouteKeyarguments.put("x-dead-letter-routing-key", "lisi");// 声明普通队列channel.queueDeclare(NORMAL_QUEUE, false, false, false, arguments);// 普通的绑定channel.queueBind(NORMAL_QUEUE, NORMAL_EXCHANGE, "zhangsan");DeliverCallback deliverCallback = (consumerTag, message) -> {String msg = new String(message.getBody());System.out.println("consumer01接收到消息:" + msg);};channel.basicConsume(NORMAL_QUEUE, false, deliverCallback, consumerTag -> {});}
}

 

消费者 C2 代码(以上步骤完成后 启动 C2 消费者 它消费死信队列里面的消息)

public class Consumer02 {public static final String DEAD_QUEUE = "dead_queue";public static void main(String[] args) throws IOException {Channel channel = RabbitMqUtils.getChannel();System.out.println("等待接收死信队列消息.....");DeliverCallback deliverCallback = (consumerTag, message) -> {System.out.println("Consumer02 接收死信队列的消息:" + new String(message.getBody()));};channel.basicConsume(DEAD_QUEUE, true, deliverCallback, consumerTag -> {});}
}

 

 

(四)队列达到最大长度

我们在声明普通队列时添加一个参数x-max-length即可

生产者

public class Producer {public static final String NORMAL_EXCHANGE = "normal_exchange";public static void main(String[] args) throws IOException {Channel channel = RabbitMqUtils.getChannel();for (int i = 0; i < 10; i++) {String message = "info" + i;channel.basicPublish(NORMAL_EXCHANGE, "zhangsan", null, message.getBytes());}}
}
C1 消费者修改以下代码(启动之后关闭该消费者 模拟其接收不到消息),这里设置了队列最多容纳6条消息,此时由于生产者发送了10条消息,所以有4条会进入死信队列。
public class Consumer01 {public static final String NORMAL_QUEUE = "normal_queue";public static final String NORMAL_EXCHANGE = "normal_exchange";public static final String DEAD_QUEUE = "dead_queue";public static final String DEAD_EXCHANGE = "dead_exchange";public static void main(String[] args) throws IOException {Channel channel = RabbitMqUtils.getChannel();// 声明普通和死信交换机channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);// 声明死信队列channel.queueDeclare(DEAD_QUEUE, false, false, false, null);// 死信的绑定channel.queueBind(DEAD_QUEUE, DEAD_EXCHANGE, "lisi");Map<String, Object> arguments = new HashMap<>();// 普通队列设置对应的交换机arguments.put("x-dead-letter-exchange", DEAD_EXCHANGE);// 设置死信队列的RouteKeyarguments.put("x-dead-letter-routing-key", "lisi");// 设置队列最大长度arguments.put("x-max-length", 6);// 声明普通队列channel.queueDeclare(NORMAL_QUEUE, false, false, false, arguments);// 普通的绑定channel.queueBind(NORMAL_QUEUE, NORMAL_EXCHANGE, "zhangsan");DeliverCallback deliverCallback = (consumerTag, message) -> {String msg = new String(message.getBody());System.out.println("consumer01接收到消息:" + msg);};channel.basicConsume(NORMAL_QUEUE, false, deliverCallback, consumerTag -> {});}
}
注意此时需要把原先队列删除 因为参数改变了
C2 消费者代码不变(启动 C2 消费者)

 

总结

死信队列可能出现的三种情况为:

①消息被拒(消费者方拒绝签收该消息)

②消息设置的TTL过期(生产者方设置的过期时间)

③消息投放的队列内消息已经满了,放不进入时消息会进入死信队列

http://www.hyszgw.com/news/73647.html

相关文章:

  • 个人网站备案名网页打不开但是能上网
  • 药品网站订单源码网站建设合作品牌
  • 金融网站建设公司排名网络营销策略包括哪几大策略
  • 做毕业设计的参考文献网站html博客转wordpress
  • 江苏工信部网站备案十条网站建设的seo策略
  • flashfxp怎么上传网站怎么把网站提交给搜索引擎
  • 网站产品怎么改顺序开网站做网站
  • 自己做的网站如何联网国外搜索引擎网址
  • 网站上加一个浮动小框怎么做网站排名工具
  • 网站添加qq聊天深圳网页设计兴田德润优惠吗
  • 个人网站主页企业网络安全设计方案
  • 葫芦岛市营商环境建设管理局网站邢台哪儿专业做网站
  • 网站建设技术指标网页设计与制作课程标准中职
  • 顶尖网站建设公司网站建设页面大小
  • 2023年没有封闭的网站有哪些线下推广图片
  • 网站跟wordpress连接企业网是什么意思
  • 广元建设厅官方网站做快手头像的网站
  • 安徽网站建设电话搜索引擎免费下载
  • 怎么做网站加盟东莞网站建设与网络推广
  • 深圳flash网站建设替代 wordpress
  • 星锐网站建设京津冀协同发展的战略意义
  • 大沥网站制作商丘市网
  • 中国品牌网官方网站帝国和织梦哪个做网站好
  • 在线网站制作体育新闻
  • 怎么样建立网站方案河北唐山 网站建设
  • 给设计网站做图是商用吗怎么自学互联网技术
  • 宁波慈溪网站建设wordpress菜单注册
  • wordpress怎么启用经典编辑器seo华为网站诊断报告
  • sql数据库添加网站网站建设百度搜索到左边的图
  • 重庆免费建站单位网站服务的建设及维护