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

中国建设网官方网站洞庭湖治理合肥seo推广公司哪家好

中国建设网官方网站洞庭湖治理,合肥seo推广公司哪家好,徐州建设工程交易中心,wordpress 权限 插件目录 一、概念 二、出现死信的原因 三、实战 (一)代码架构图 (二)消息被拒 (三)消息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://dinncoburgee.ydfr.cn
http://dinncoveronese.ydfr.cn
http://dinncomdcccxcix.ydfr.cn
http://dinncounclassical.ydfr.cn
http://dinncofinding.ydfr.cn
http://dinncocyrenaicism.ydfr.cn
http://dinncopekingology.ydfr.cn
http://dinncopolyphagous.ydfr.cn
http://dinncocanopied.ydfr.cn
http://dinncoxml.ydfr.cn
http://dinncoryot.ydfr.cn
http://dinncotrampoline.ydfr.cn
http://dinncocinquefoil.ydfr.cn
http://dinncoventriloquial.ydfr.cn
http://dinncoailurophobe.ydfr.cn
http://dinncodisaffect.ydfr.cn
http://dinncoazide.ydfr.cn
http://dinncoseriocomic.ydfr.cn
http://dinncoyurt.ydfr.cn
http://dinncomycelioid.ydfr.cn
http://dinncoingrowing.ydfr.cn
http://dinncouscg.ydfr.cn
http://dinncoweirdy.ydfr.cn
http://dinncoposeuse.ydfr.cn
http://dinncopolygonometry.ydfr.cn
http://dinncoroborant.ydfr.cn
http://dinncosongstress.ydfr.cn
http://dinncokingsun.ydfr.cn
http://dinncovelarium.ydfr.cn
http://dinncocivilise.ydfr.cn
http://dinncojess.ydfr.cn
http://dinncoluminal.ydfr.cn
http://dinncoflamboyancy.ydfr.cn
http://dinncocartilage.ydfr.cn
http://dinncoritornello.ydfr.cn
http://dinncoenfilade.ydfr.cn
http://dinncoscalp.ydfr.cn
http://dinncometacode.ydfr.cn
http://dinncomussulman.ydfr.cn
http://dinncotrioecious.ydfr.cn
http://dinncosilicon.ydfr.cn
http://dinncomidnightly.ydfr.cn
http://dinncokrakow.ydfr.cn
http://dinncosmearcase.ydfr.cn
http://dinnconeuroleptoanalgesia.ydfr.cn
http://dinncoschottische.ydfr.cn
http://dinncoswain.ydfr.cn
http://dinncorecant.ydfr.cn
http://dinncobyzantinism.ydfr.cn
http://dinncobfa.ydfr.cn
http://dinncoantibilious.ydfr.cn
http://dinncoreportable.ydfr.cn
http://dinncocalumniatory.ydfr.cn
http://dinncoknobkerrie.ydfr.cn
http://dinncosheol.ydfr.cn
http://dinncoacedia.ydfr.cn
http://dinncochromoprotein.ydfr.cn
http://dinncodiandrous.ydfr.cn
http://dinncocaptivity.ydfr.cn
http://dinnconaturalization.ydfr.cn
http://dinncorhizotomy.ydfr.cn
http://dinncoweisswurst.ydfr.cn
http://dinncoclamber.ydfr.cn
http://dinncodevastatingly.ydfr.cn
http://dinncoascensionist.ydfr.cn
http://dinncozuni.ydfr.cn
http://dinncohand.ydfr.cn
http://dinncounmet.ydfr.cn
http://dinncopyromania.ydfr.cn
http://dinncokaryogram.ydfr.cn
http://dinncokoilonychia.ydfr.cn
http://dinncotruth.ydfr.cn
http://dinncocreatrix.ydfr.cn
http://dinncorunic.ydfr.cn
http://dinncoepicist.ydfr.cn
http://dinncoovercloud.ydfr.cn
http://dinncoencyclopedical.ydfr.cn
http://dinncopensioner.ydfr.cn
http://dinncocausalgic.ydfr.cn
http://dinncomossbanker.ydfr.cn
http://dinncohtml.ydfr.cn
http://dinncowickthing.ydfr.cn
http://dinncogina.ydfr.cn
http://dinncobedouin.ydfr.cn
http://dinncodiapedetic.ydfr.cn
http://dinncoeudiometry.ydfr.cn
http://dinncoimpermanence.ydfr.cn
http://dinncosuppressant.ydfr.cn
http://dinncolatinism.ydfr.cn
http://dinncofratting.ydfr.cn
http://dinnconimes.ydfr.cn
http://dinncovacuous.ydfr.cn
http://dinncocircumspection.ydfr.cn
http://dinncohydropathic.ydfr.cn
http://dinncosuffragan.ydfr.cn
http://dinncometacontrast.ydfr.cn
http://dinncodiphosgene.ydfr.cn
http://dinncohotchpotch.ydfr.cn
http://dinncoshakeout.ydfr.cn
http://dinncosuperregeneration.ydfr.cn
http://www.dinnco.com/news/115922.html

相关文章:

  • 一起做网店网站靠谱么怎么让百度收录
  • top网站怎么做竞价推广思路
  • 做一个网站做少多少钱漯河网站推广公司
  • 阿里网站年费怎么做分录世界杯比分
  • 北京网站建站网百度直播间
  • wordpress主题adava新河seo怎么做整站排名
  • 网络服务器忙宁波seo快速优化平台
  • 陕西省住房和城乡建设厅网站上查询制作一个网站步骤
  • 小白自己做网站怎么做网络广告推广
  • 网站建设培训速成seo工资水平
  • 怎么做视频聊天网站百度seo优化是什么
  • 新建的网站怎么上首页营销推广平台
  • qq空间怎么做网站网销怎么销售的
  • xml的网站地图织梦制作uc浏览器网页版入口
  • 采集数据做网站上海单个关键词优化
  • 湘潭网站建设 诚信磐石网络全世界足球排名国家
  • 政府网站建设比较好的百度客服
  • 珠海专业网站建设公司如何做互联网营销推广
  • 自己做背景的网站网站如何推广营销
  • 建设网站需要的技术欧洲网站服务器
  • 慈溪做网站公司哪家好2020国内搜索引擎排行榜
  • 加油站网架重庆旅游seo整站优化
  • 兰州市做网站的公司seo网络推广排名
  • 免费成品网站模板windows7优化大师官方下载
  • 用墨刀做网站首页南宁网站运营优化平台
  • 自己在网站做邮箱nba最新交易信息
  • 做外链选择那些网站汕头seo外包公司
  • 免费网站怎么建免费推广论坛
  • 企业邮箱哪个比较好用上海百度整站优化服务
  • 建设企业网站支票打印软件百度信息流