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

网站建站的步骤企业邮箱要收费吗

网站建站的步骤,企业邮箱要收费吗,四方坪网站建设,太原网页设计师分布式中间件:RabbitMQ死信队列和延迟队列 引言 在分布式系统的开发中,消息队列是一种常用的通信机制,它可以帮助我们实现系统之间的解耦、异步处理和流量削峰等功能。RabbitMQ 作为一款功能强大的消息队列中间件,提供了许多高级…

分布式中间件:RabbitMQ死信队列和延迟队列

引言

在分布式系统的开发中,消息队列是一种常用的通信机制,它可以帮助我们实现系统之间的解耦、异步处理和流量削峰等功能。RabbitMQ 作为一款功能强大的消息队列中间件,提供了许多高级特性,其中死信队列和延迟队列在实际应用中非常实用。本文将详细介绍 RabbitMQ 的死信队列和延迟队列,并结合具体的代码示例进行讲解。

RabbitMQ 配置类

首先,我们来看一个 RabbitMQ 的配置类,这个配置类定义了一些基本的 RabbitMQ 配置,包括单一消费者实例配置、多个消费者实例配置以及自定义的 RabbitMQ 发送消息组件。

@Configuration
public class RabbitmqConfig {@Autowiredprivate Environment environment; // 注入rabbitmq环境@Autowiredprivate CachingConnectionFactory connectionFactory; // 注入rabbitmq连接工厂@Autowiredprivate SimpleRabbitListenerContainerFactoryConfigurer factoryConfigurer; // 注入rabbitmq配置// 单一消费者实例配置@Bean("singleListenerContainer")public SimpleRabbitListenerContainerFactory singleListenerContainer() {// 创建一个监听容器工厂SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();// 设置连接工厂factory.setConnectionFactory(connectionFactory);// 设置消息转换器factory.setMessageConverter(new Jackson2JsonMessageConverter());// 设置并发消费factory.setConcurrentConsumers(1);// 设置最大并发消费factory.setMaxConcurrentConsumers(1);// 设置最大单条消费消息factory.setPrefetchCount(1);return factory;}// 多个消费者实例@Bean("multiListenerContainer")public SimpleRabbitListenerContainerFactory multiListenerContainer() {// 创建一个监听容器工厂SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();// 设置连接工厂factoryConfigurer.configure(factory, connectionFactory);// 设置消息转换器factory.setMessageConverter(new Jackson2JsonMessageConverter());// 设置手动提交factory.setAcknowledgeMode(AcknowledgeMode.NONE);// 设置并发消费factory.setConcurrentConsumers(10);// 设置最大并发消费factory.setMaxConcurrentConsumers(20);// 设置最大单条消费消息factory.setPrefetchCount(10);return factory;}// 自定义RabbitMQ发送消息组件@Beanpublic RabbitTemplate rabbitTemplate() {// 设置消息发送确认connectionFactory.setPublisherConfirms(true);// 设置消息发送返回connectionFactory.setPublisherReturns(true);// 创建rabbitTemplateRabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);// 设置消息发送确认回调rabbitTemplate.setMandatory(true);// 设置消息发送确认回调rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {if (ack) {System.out.println("消息发送成功");} else {System.out.println("消息发送失败:" + cause + correlationData.toString());}});// 设置消息发送返回回调rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {System.out.println("消息丢失:exchange:" + exchange + ",route:" + routingKey + ",replyCode:" + replyCode + ",replyText:" + replyText);});// 设置消息转换器rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());return rabbitTemplate;}
}

代码解释

  1. 单一消费者实例配置(singleListenerContainer

    • 创建了一个 SimpleRabbitListenerContainerFactory 实例,用于处理单一消费者的消息监听。
    • 设置了连接工厂、消息转换器、并发消费者数量、最大并发消费者数量和最大单条消费消息数量。
  2. 多个消费者实例配置(multiListenerContainer

    • 同样创建了一个 SimpleRabbitListenerContainerFactory 实例,用于处理多个消费者的消息监听。
    • 配置了手动提交模式,设置了更大的并发消费者数量和最大并发消费者数量。
  3. 自定义 RabbitMQ 发送消息组件(rabbitTemplate

    • 设置了消息发送确认和返回机制。
    • 定义了消息发送确认回调和返回回调,用于处理消息发送成功和失败的情况。
    • 设置了消息转换器,使用 Jackson2JsonMessageConverter 进行消息的序列化和反序列化。

死信队列

什么是死信队列

死信队列(Dead Letter Queue)是一种特殊的队列,当消息满足某些条件时,会被发送到死信队列中。这些条件包括:

  • 消息被拒绝(basic.rejectbasic.nack)并且 requeue 参数设置为 false
  • 消息过期(TTL)。
  • 队列达到最大长度。

死信队列的应用场景

  • 消息重试:当消息处理失败时,可以将消息发送到死信队列,经过一定的处理后再重新发送到原队列进行重试。
  • 记录失败消息:将失败的消息存储在死信队列中,方便后续的排查和处理。

代码示例

以下是一个简单的死信队列配置示例:

@Configuration
public class DeadLetterConfig {// 正常交换机public static final String NORMAL_EXCHANGE = "normal.exchange";// 正常队列public static final String NORMAL_QUEUE = "normal.queue";// 死信交换机public static final String DEAD_LETTER_EXCHANGE = "dead.letter.exchange";// 死信队列public static final String DEAD_LETTER_QUEUE = "dead.letter.queue";// 路由键public static final String ROUTING_KEY = "normal.routing.key";// 声明正常交换机@BeanDirectExchange normalExchange() {return new DirectExchange(NORMAL_EXCHANGE);}// 声明死信交换机@BeanDirectExchange deadLetterExchange() {return new DirectExchange(DEAD_LETTER_EXCHANGE);}// 声明正常队列并绑定死信交换机@BeanQueue normalQueue() {Map<String, Object> args = new HashMap<>();// 设置死信交换机args.put("x-dead-letter-exchange", DEAD_LETTER_EXCHANGE);// 设置死信路由键args.put("x-dead-letter-routing-key", ROUTING_KEY);return new Queue(NORMAL_QUEUE, true, false, false, args);}// 声明死信队列@BeanQueue deadLetterQueue() {return new Queue(DEAD_LETTER_QUEUE, true);}// 绑定正常队列和正常交换机@BeanBinding normalBinding() {return BindingBuilder.bind(normalQueue()).to(normalExchange()).with(ROUTING_KEY);}// 绑定死信队列和死信交换机@BeanBinding deadLetterBinding() {return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with(ROUTING_KEY);}
}

代码解释

  1. 交换机和队列的声明

    • 声明了正常交换机、正常队列、死信交换机和死信队列。
    • 在正常队列的声明中,通过 args 参数设置了死信交换机和死信路由键。
  2. 绑定关系

    • 将正常队列绑定到正常交换机,将死信队列绑定到死信交换机。

延迟队列

什么是延迟队列

延迟队列是一种可以让消息在指定的时间后才被消费的队列。在 RabbitMQ 中,可以通过消息的 TTL(Time To Live)和死信队列来实现延迟队列的功能。

延迟队列的应用场景

  • 订单超时处理:当用户下单后,如果在一定时间内没有支付,可以使用延迟队列来处理订单超时的情况。
  • 缓存刷新:定期刷新缓存,可以使用延迟队列来实现定时任务。

代码示例

以下是一个简单的延迟队列配置示例:

@Configuration
public class DelayQueueConfig {// 延迟交换机public static final String DELAY_EXCHANGE = "delay.exchange";// 延迟队列public static final String DELAY_QUEUE = "delay.queue";// 死信交换机public static final String DEAD_LETTER_EXCHANGE = "dead.letter.exchange";// 死信队列public static final String DEAD_LETTER_QUEUE = "dead.letter.queue";// 路由键public static final String ROUTING_KEY = "delay.routing.key";// 声明延迟交换机@BeanDirectExchange delayExchange() {return new DirectExchange(DELAY_EXCHANGE);}// 声明死信交换机@BeanDirectExchange deadLetterExchange() {return new DirectExchange(DEAD_LETTER_EXCHANGE);}// 声明延迟队列并绑定死信交换机@BeanQueue delayQueue() {Map<String, Object> args = new HashMap<>();// 设置死信交换机args.put("x-dead-letter-exchange", DEAD_LETTER_EXCHANGE);// 设置死信路由键args.put("x-dead-letter-routing-key", ROUTING_KEY);// 设置消息的 TTLargs.put("x-message-ttl", 5000); // 5 秒return new Queue(DELAY_QUEUE, true, false, false, args);}// 声明死信队列@BeanQueue deadLetterQueue() {return new Queue(DEAD_LETTER_QUEUE, true);}// 绑定延迟队列和延迟交换机@BeanBinding delayBinding() {return BindingBuilder.bind(delayQueue()).to(delayExchange()).with(ROUTING_KEY);}// 绑定死信队列和死信交换机@BeanBinding deadLetterBinding() {return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with(ROUTING_KEY);}
}

代码解释

  1. 交换机和队列的声明

    • 声明了延迟交换机、延迟队列、死信交换机和死信队列。
    • 在延迟队列的声明中,通过 args 参数设置了死信交换机、死信路由键和消息的 TTL。
  2. 绑定关系

    • 将延迟队列绑定到延迟交换机,将死信队列绑定到死信交换机。

总结

本文介绍了 RabbitMQ 的死信队列和延迟队列的概念、应用场景,并结合具体的代码示例进行了详细的讲解。死信队列和延迟队列在分布式系统中非常实用,可以帮助我们处理消息失败、实现定时任务等功能。通过合理使用这些特性,可以提高系统的可靠性和稳定性。

希望本文对你理解 RabbitMQ 的死信队列和延迟队列有所帮助。如果你有任何疑问或建议,欢迎在评论区留言。


文章转载自:

http://McfZUxkb.kpcky.cn
http://CQE6cKl2.kpcky.cn
http://ttVm3Pej.kpcky.cn
http://qjpACoeR.kpcky.cn
http://uXzGvPLT.kpcky.cn
http://QbaGtlwX.kpcky.cn
http://aGHxlpQn.kpcky.cn
http://u3r6iebT.kpcky.cn
http://3aITYlo5.kpcky.cn
http://FwkQB1k6.kpcky.cn
http://30UgUkxJ.kpcky.cn
http://ZECQ1OVC.kpcky.cn
http://ORNa1e9e.kpcky.cn
http://uzuMFUDo.kpcky.cn
http://Iif9GnB5.kpcky.cn
http://fVzCsbh3.kpcky.cn
http://JQGIVqMH.kpcky.cn
http://7rnkXODr.kpcky.cn
http://9gQ79Moz.kpcky.cn
http://HfmFM7X5.kpcky.cn
http://q2ifXeZu.kpcky.cn
http://uLZM0DCB.kpcky.cn
http://S1MabVMn.kpcky.cn
http://BF9tPMgn.kpcky.cn
http://28XJ87kY.kpcky.cn
http://bsjA5LOF.kpcky.cn
http://N3ggVuDD.kpcky.cn
http://A7lBOoNr.kpcky.cn
http://2xuIG9Eq.kpcky.cn
http://7W3Bj2Dj.kpcky.cn
http://www.dtcms.com/wzjs/757642.html

相关文章:

  • 网站排名在线优化工具wordpress 汉化 插件怎么用
  • 深圳可以做网站的公司校园网站开发的需求分析
  • 用户研究网站河北移动端网站建设
  • wordpress手机站主题有哪些推广平台和渠道
  • 教育机构电商网站建设加盟标志设计作业
  • 前几年做那个网站能致富做长尾词优化去哪些网站
  • 成都市建设监理协会网站wordpress前端是什么
  • 苏州网站设计价格重庆平台网站建设找哪家
  • 网站上的图片格式怎么做wordpress 不能更新
  • 郑州市建设局网站wordpress图片命名
  • 做图海报网站旅游网站规划设计方案
  • 做网站困难嘛想自己做个网站怎么做
  • 写出网站建设的基本流程山东ui设计培训班
  • 网站建设意义和作用网站自助建站开发制作
  • 人防工程做资料的网站带后台的网站模板
  • 长春网站开发招聘杭州建设信用平台
  • 为网站网站做推广深圳seo搜索优化
  • 哪个网站可以接广告做做单页网站需要做什么
  • 三明市住房和城乡建设局网站网站开发时间表
  • 做模板网站贵阳市网站做的最好的
  • 物流网站首页图片wordpress的slider
  • 进度跟踪网站开发做电商网站的流程
  • 成都免费建网站公司wordpress 翻译函数
  • 怎样建设淘客网站青岛互联网设计公司
  • 简洁的个人网站淘宝提货网站怎么做的
  • 学网站开发哪里好90做网站
  • 嘉兴装修公司做网站郑州小程序制作流程及费用
  • 深圳网站建设建设wordpress 买域名
  • 成都专业做网站的公司做受视频网站
  • 上网出现危险网站整站排名优化公司