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

梅州做网站九易建网站的建站流程

梅州做网站,九易建网站的建站流程,罗湖附近公司做网站建设哪家服务周到,WordPress复制摘要1. 概念 死信队列(Dead Letter Queue)是在消息队列系统中的一种特殊队列,用于存储无法被消费的消息。消息可能会因为多种原因变成“死信”,例如消息过期、消息被拒绝、消息队列长度超过限制等。当消息变成“死信”时,…

1. 概念

死信队列(Dead Letter Queue)是在消息队列系统中的一种特殊队列,用于存储无法被消费的消息。消息可能会因为多种原因变成“死信”,例如消息过期、消息被拒绝、消息队列长度超过限制等。当消息变成“死信”时,它们会被路由到死信队列中,以便进行进一步处理或分析。 死信队列能够帮助系统进行消息跟踪、监控和处理异常情况,是消息队列系统中的重要组成部分。

2. 应用场景

死信队列在消息队列系统中有多种应用场景,包括但不限于以下几个方面:

  • 延迟消息处理:实现延迟消息投递,例如实现消息的定时投递、消息重试机制等。

  • 任务调度:用于实现任务调度系统,例如延迟执行任务、失败重试任务等。

  • 异常处理:处理消息消费失败或超时的情况,对异常消息进行统一处理。

  • 业务流程控制:实现业务流程中的状态控制和超时处理,例如订单超时取消、支付超时处理等。

  • 监控和统计:对异常消息进行统计和分析,用于系统性能监控和问题排查。

这些应用场景展示了死信队列的灵活性和实用性,在实际系统开发中具有广泛的应用价值。

3. 造成消息进入死信队列的原因

消息成为死信的原因有以下几种:

  • 消息被拒绝(basic.reject或basic.nack),并且requeue标志被设置为false。若参数requeue为true,则表示还可以将此跳消息重新塞回普通队列,若为false则消息被拒绝后直接进入死信队列。

  • 消息过期。在生产者设置生产时设置,若消费者未在过期时间内消费消息,则消息被转发到死信队列中。("x-message-ttl")

  • 队列达到最大长度。当普通队列中消息堆积数量长度达到了maxLength,则会将新接收的消息转发到死信队列中去,从而避免消息丢失。

4. 死信队列工作流程图

5. 代码示例

5.1 引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>2.7.15</version>
</dependency>

5.2 RabbitMQ配置

@Configuration
public class RabbitConfig {/*** 死信队列消息模型构建----------------------------------------------------------------------------------**/// 创建普通队列@Beanpublic Queue basicQueue() {Map<String, Object> params = new HashMap<>(8);// x-dead-letter-exchange 声明了队列里的死信转发到的DLX名称,params.put("x-dead-letter-exchange", Exchange.DEMO_DEAD_LETTER_EXCHANGE);// x-dead-letter-routing-key 声明了这些死信在转发时携带的 routing-key 名称。params.put("x-dead-letter-routing-key", RoutingKey.DEMO_DEAD_ROUTING_KEY);// 注意这里是毫秒单位,这里我们给10秒params.put("x-message-ttl", 10*1000);return new Queue(MyQueue.DEMO_CONSUMER_QUEUE, true, false, false, params);}//创建“基本消息模型”的基本交换机,面向生产者@Beanpublic TopicExchange basicExchange() {//创建并返回基本交换机实例return new TopicExchange(Exchange.DEMO_BASIC_NORMAL_EXCHANGE, true, false);}//创建“基本消息模型”的基本绑定(基本交换机+基本路由),面向生产者@Beanpublic Binding basicBinding() {//创建并返回基本消息模型中的基本绑定(注意这里是正常交换机跟死信队列绑定在一定,不叫死信路由)return BindingBuilder.bind(basicQueue()).to(basicExchange()).with(RoutingKey.DEMO_ROUTING_KEY);}// 创建死信交换机@Beanpublic TopicExchange deadLetterExchange() {//创建并返回死信交换机实例return new TopicExchange(Exchange.DEMO_DEAD_LETTER_EXCHANGE, true, false);}// 创建第二个中转站// 创建死信队列@Beanpublic Queue deadLetterQueue() {return new Queue(MyQueue.DEMO_DEAD_LETTER_QUEUE, true);}// 创建死信路由及其绑定@Beanpublic Binding deadLetterBinding() {return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with(RoutingKey.DEMO_DEAD_ROUTING_KEY);}public static class Exchange {public static final String DEMO_BASIC_NORMAL_EXCHANGE = "demo.basic.exchange";public static final String DEMO_DEAD_LETTER_EXCHANGE = "demo.dead.letter.exchange";}public static class RoutingKey {//交换机与报表队列绑定的RoutingKeypublic static final String DEMO_ROUTING_KEY = "demo.basic.routing.key";public static final String DEMO_DEAD_ROUTING_KEY = "demo.dead.routing.key";}/*** 队列名称* @author peng.zhang* @date 2024/01/30*/public static class MyQueue {//报表队列名称public static final String DEMO_CONSUMER_QUEUE = "demo.basic.queue";//死信队列名称public static final String DEMO_DEAD_LETTER_QUEUE = "demo.dead.letter.queue";}
}

5.3 消息生产者

@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {@Resourceprivate RabbitTemplate rabbitTemplate;/*** 发送消息到死信队列*/@PostMapping("/testDeadQueue")public String testDeadQueue() {// 设置生产者到交换机的确认回调rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {log.info("correlationData:{}, ack:{}, cause:{}", JSON.toJSONString(correlationData), ack, cause);});// 设置消息未被队列接收时的返回回调rabbitTemplate.setReturnCallback((message, replyCode, replyText, ex, routing) -> {log.info("message:{}, replyCode:{}, replyText:{}, exchange:{}, routingKey:{}", JSON.toJSONString(message),replyCode, replyText, ex, routing);});// 生成关联数据并发送消息到交换机CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());// 消息内容String messageBody = StrUtil.format("this message send at {}", DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss"));rabbitTemplate.convertAndSend(RabbitConfig.Exchange.DEMO_BASIC_NORMAL_EXCHANGE, RabbitConfig.RoutingKey.DEMO_ROUTING_KEY, messageBody, correlationData);log.info(">>>>>{}, 发送消息:{}", DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss"), messageBody);return "OK";}}

5.4 消息消费者

@Component
@Slf4j
public class DeadLetterConsumer {/*** 监听 DEMO_CONSUMER_QUEUE 并处理传入的消息。* 为测试目的抛出 IOException 以模拟异常。** @param messageBody 消息负载* @param headers     消息头* @param channel     用于消息确认的通道* @throws IOException 如果抛出异常*/@RabbitListener(queues = RabbitConfig.MyQueue.DEMO_CONSUMER_QUEUE)@RabbitHandlerpublic void testBasicQueueAndThrowsException(@Payload String messageBody, @Headers Map<String, Object> headers, Channel channel) throws IOException {/*** Delivery Tag 用来标识信道中投递的消息。RabbitMQ 推送消息给 Consumer 时,会附带一个 Delivery Tag,* 以便 Consumer 可以在消息确认时告诉 RabbitMQ 到底是哪条消息被确认了。* RabbitMQ 保证在每个信道中,每条消息的 Delivery Tag 从 1 开始递增。*/Long tag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);log.info(">>>>>{} 普通队列消费, tag = {}, 消息内容:{}", DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss"), tag, messageBody);/***  multiple 取值为 false 时,表示通知 RabbitMQ 当前消息被确认*  如果为 true,则额外将比第一个参数指定的 delivery tag 小的消息一并确认*/// ACK,确认一条消息已经被消费
//        channel.basicAck(deliveryTag, false);// 对应的业务操作。。。。。// doBusiness();// 模拟消息拒绝channel.basicNack(tag, false, false);}/*** 处理业务逻辑*/private void doBusiness() {System.out.println("here do some business code");}/*** 监听死信队列并处理消息。** @param data    消息内容* @param tag     消息标签* @param channel 通道*/@RabbitListener(queues = RabbitConfig.MyQueue.DEMO_DEAD_LETTER_QUEUE)@RabbitHandlerpublic void fromDeadLetter(@Payload String data, @Header(AmqpHeaders.DELIVERY_TAG) long tag, Channel channel) {log.info(">>>>>{} 死信队列消费, tag = {}, 消息内容:{}", DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss"), tag, data);// 对应的业务操作。。。。。}
}

5.5 YML配置

spring:rabbitmq:username: rabbitmqpassword: rabbitmqport: 5672host: 127.0.0.1#publisher-confirm-type参数有三个可选值:#SIMPLE:会触发回调方法,相当于单个确认(发一条确认一条)。#CORRELATED:消息从生产者发送到交换机后触发回调方法。#NONE(默认):关闭发布确认模式。publisher-confirm-type: correlatedtemplate:receive-timeout: 1800000reply-timeout: 1800000retry:enabled: falselistener:direct:retry:enabled: truedefault-requeue-rejected: falsesimple:retry:# 是否开启消费者重试(为false时关闭消费者重试,这时消费端代码异常会一直重复收到消息)enabled: true# 最大重试次数max-attempts: 1# 重试间隔时间(单位毫秒)initial-interval: 10000# 重试最大时间间隔(单位毫秒)max-interval: 300000# 应用于前一重试间隔的乘法器multiplier: 5default-requeue-rejected: false

5.6 控制台输出

从控制台可以看出,消息被拒绝后,大概10秒后死信队列消息被消费。


文章转载自:
http://retreatism.fzLk.cn
http://repat.fzLk.cn
http://electrophysiological.fzLk.cn
http://tamein.fzLk.cn
http://lattice.fzLk.cn
http://variation.fzLk.cn
http://carnarvon.fzLk.cn
http://tardily.fzLk.cn
http://flexile.fzLk.cn
http://shapely.fzLk.cn
http://possessor.fzLk.cn
http://uniatism.fzLk.cn
http://attributable.fzLk.cn
http://granitoid.fzLk.cn
http://podolsk.fzLk.cn
http://reges.fzLk.cn
http://despairing.fzLk.cn
http://northwesterly.fzLk.cn
http://emulgent.fzLk.cn
http://beginner.fzLk.cn
http://retrofocus.fzLk.cn
http://miniver.fzLk.cn
http://chrysoidine.fzLk.cn
http://stript.fzLk.cn
http://brindisi.fzLk.cn
http://oldrecipient.fzLk.cn
http://okefenokee.fzLk.cn
http://cainogenesis.fzLk.cn
http://tagmemics.fzLk.cn
http://lidocaine.fzLk.cn
http://retina.fzLk.cn
http://misstep.fzLk.cn
http://biferous.fzLk.cn
http://epaxial.fzLk.cn
http://sectarianize.fzLk.cn
http://intendant.fzLk.cn
http://unmusicality.fzLk.cn
http://promiscuous.fzLk.cn
http://bedazzle.fzLk.cn
http://ourn.fzLk.cn
http://houseplace.fzLk.cn
http://alsike.fzLk.cn
http://tribunitian.fzLk.cn
http://celanese.fzLk.cn
http://feverous.fzLk.cn
http://purl.fzLk.cn
http://elaterid.fzLk.cn
http://aye.fzLk.cn
http://preadamite.fzLk.cn
http://befringe.fzLk.cn
http://vulgate.fzLk.cn
http://fabulist.fzLk.cn
http://hardcover.fzLk.cn
http://sphygmogram.fzLk.cn
http://adduct.fzLk.cn
http://aggrandizement.fzLk.cn
http://flavoprotein.fzLk.cn
http://nickle.fzLk.cn
http://protonation.fzLk.cn
http://aurantiaceous.fzLk.cn
http://arrenotokous.fzLk.cn
http://generically.fzLk.cn
http://mutagenesis.fzLk.cn
http://dumpage.fzLk.cn
http://triangularity.fzLk.cn
http://rente.fzLk.cn
http://pitfall.fzLk.cn
http://spinsterish.fzLk.cn
http://vexillology.fzLk.cn
http://inaccessibly.fzLk.cn
http://capouch.fzLk.cn
http://limbo.fzLk.cn
http://kebob.fzLk.cn
http://yeomen.fzLk.cn
http://julian.fzLk.cn
http://extrauterine.fzLk.cn
http://lockfast.fzLk.cn
http://transfixion.fzLk.cn
http://sharpeville.fzLk.cn
http://diadochokinesia.fzLk.cn
http://shipside.fzLk.cn
http://ranunculus.fzLk.cn
http://uptorn.fzLk.cn
http://incontrovertible.fzLk.cn
http://tankerman.fzLk.cn
http://limbless.fzLk.cn
http://epigynous.fzLk.cn
http://zonky.fzLk.cn
http://disyllabic.fzLk.cn
http://showmanship.fzLk.cn
http://cashmere.fzLk.cn
http://handclasp.fzLk.cn
http://gnathion.fzLk.cn
http://widowerhood.fzLk.cn
http://rocketsonde.fzLk.cn
http://intellectual.fzLk.cn
http://volley.fzLk.cn
http://anecdotical.fzLk.cn
http://scintillescent.fzLk.cn
http://pomology.fzLk.cn
http://www.dt0577.cn/news/97136.html

相关文章:

  • 网站建设电脑全球访问量top100网站
  • 做土特产的网站全网营销平台
  • 长沙 php企业网站系统营销案例
  • 网站如何做原创谷歌关键词分析工具
  • ps做网站教程疫情最新数据消息地图
  • 提供信息门户网站建设优化seo系统
  • 重庆网站建设推广公司谷歌chrome官网
  • 网站建设的关键技术怎么在百度推广自己的网站
  • 建设网站时搜索引擎优化的主题
  • 建设银行网站显示404网站seo哪家好
  • 南宁网站建设网站百度文章收录查询
  • 宝安做网站公司乐云seo小程序开发框架
  • 怎样在本地测试多个织梦网站结构优化
  • 武汉 网站 备案天津seo推广软件
  • 公司官网如何被百度收录搜索引擎优化的意思
  • wordpress无法上传mp3百度seo排名优化公司哪家好
  • wordpress首页显示vip标志拼多多关键词优化是怎么弄的
  • 本地服务型网站开发潍坊seo推广
  • 网页制作与网站建设宝典 pdfseo专业推广
  • 自己用电脑网站建设杭州龙席网络seo
  • 建设管理部门网站查询上海今天刚刚发生的新闻
  • 做美女图片网站挣钱么seo公司网站
  • 深圳网站制作880怎么样关键词优化
  • 深圳学校网站建设seo自然排名
  • app开发网站建设公司企业网站页面设计
  • wordpress 文章 样式天津seo公司
  • 网站营销队伍太原网站快速排名提升
  • 自己做抽奖网站违法友情链接怎么设置
  • 网站开发模合同大型网站建设公司
  • 网站怎么做访客收藏链接网站设计