怎么让同一个局域网上的计算机看到我做的网站中山建网站找哪家
- 作者: 五速梦信息网
- 时间: 2026年03月21日 06:47
当前位置: 首页 > news >正文
怎么让同一个局域网上的计算机看到我做的网站,中山建网站找哪家,外贸网站建设定做,怎么让网站快速被收录#x1f4dd;个人主页#xff1a;哈__
期待您的关注 目录 一、#x1f525;死信队列
RabbitMQ的工作模式 死信队列的工作模式 二、#x1f349;RabbitMQ相关的安装
三、#x1f34e;SpringBoot引入RabbitMQ
1.引入依赖
2.创建队列和交换器
2.1 变量声明
2.2 创建… 个人主页哈__
期待您的关注 目录 一、死信队列
RabbitMQ的工作模式 死信队列的工作模式 二、RabbitMQ相关的安装
三、SpringBoot引入RabbitMQ
1.引入依赖
2.创建队列和交换器
2.1 变量声明
2.2 创建延迟交换器
2.3 创建延迟队列
2.4 延迟队列绑定延迟交换器
2.5 死信队列配置
- 添加application.yml
- 添加RabbitMQListener 消费者
- 创建DelayMessageSender
- 创建Controller 7.测试 四、死信队列的应用场景 一、死信队列 RabbitMQ的死信队列Dead Letter QueueDLQ是一种特殊的队列用于接收其他队列中的“死信”消息。所谓“死信”是指满足一定条件而无法被消费者正确处理的消息这些条件包括消息被拒绝、消息过期、消息达到最大重试次数等。 当消息成为死信时RabbitMQ会将其重新发送到指定的死信队列而不是丢弃它们。这样做的好处是可以对死信进行分析和处理例如记录日志、重新入队或者进一步处理。 死信队列通常与RabbitMQ的延迟队列Delayed Message Queue一起使用通过延迟队列延迟消息的处理时间可以更容易地触发消息成为死信的条件从而进行测试和调试。 死信队列在消息中间件中有许多实际应用场景主要用于处理无法被正常消费的消息增强了消息的可靠性和处理能力。以下是一些常见的应用场景 延迟消息处理通过将消息发送到延迟队列在指定的时间后再将消息发送到目标队列实现延迟处理消息的功能。 消息重试当消费者无法处理消息时消息可以被重新发送到队列并设置重试次数达到最大重试次数后转发到死信队列以便进行进一步处理。 异常处理当消息无法被消费者正常处理时如格式错误、业务异常等将消息转发到死信队列用于记录日志、报警或人工处理。 消息超时处理当消息在队列中等待时间过长时可以设置消息的过期时间TTL超过时间后将消息转发到死信队列。 消息路由失败当消息无法被正确路由到目标队列时可以将消息发送到死信队列避免消息丢失。 消息版本兼容性处理当消息的格式或内容发生变化时通过死信队列可以处理老版本消息确保新版本系统的兼容性。 RabbitMQ的工作模式 死信队列的工作模式 今天我要实现的就是这个延迟队列和死信队列。生产者首先向延迟队列发送消息待达到TTL后消息会被转送到死信队列当中消费者会从死信队列中获取消息进行消费。 二、RabbitMQ相关的安装 win10 安装rabbitMQ详细步骤_rabbitmq 安装-CSDN博客 我这里直接引用别人的文章了下载需要大家去看一看。 RabbitMQ延迟插件的安装。 [超详细]RabbitMQ安装延迟消息插件_rabbitmq安装延迟插件-CSDN博客 三、SpringBoot引入RabbitMQ 1.引入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactId/dependency 2.创建队列和交换器 这一步是很重要的如果你配置错误了消息很可能无法正确的传送。要实现延迟队列和死信队列我们一共要创建以下几个组件 延迟队列延迟队列的交换器死信队列死信队列的交换器 在我们创建了这几个组件之后我们还要干一些事情我们需要把这些组件进行组装如果你不了解RabbitMQ的基础你可以先看看基础教学我这里简单的说一下。RabbitMQ中有一种绑定方式这种绑定方式会把BindingKey和RoutingKey完全匹配的进行绑定如下图所示生产者发送了一个BindingKey为“warning”的消息那么这个消息就会被发送到Queue1和Queue2这并不难理解。 我们要做的就是把队列和交换器通过一个RoutingKey绑定在一起。 2.1 变量声明 接下来的代码要好好看了首先我们把我们后边要用到的名称变量全部定义出来。因为这个名称起的很长我们不方便直接使用。创建DeadRabbitConfig。在类中定义如下变量延迟队列交换器名称、延迟队列名称、延迟队列Routing名称。除此之外还有死信队列交换器名称、死信队列名称和死信Routing名称。 // 延迟队列交换器名称public static final String DELAY_EXCHANGE_NAME delay.queue.demo.business.exchange;// 延迟队列A名称public static final String DELAY_QUEUE_A_NAME delay.queue.demo.business.queue_a;// 延迟队列B名称public static final String DELAY_QUEUE_B_NAME delay.queue.demo.business.queue_b;// 延迟队列routingA名称public static final String DELAY_QUEUE_ROUTING_A_NAME delay.queue.demo.business.queue_a.routing_key;// 延迟队列routingB名称public static final String DELAY_QUEUE_ROUTING_B_NAME delay.queue.demo.business.queue_b.routing_key;// 死信队列public static final String DEAD_LETTER_EXCHANGE delay.queue.demo.deadletter.exchange;public static final String DEAD_LETTER_QUEUE_A_ROUTING_KEY delay.queue.demo.deadletter.delay_10s.routing_key;public static final String DEAD_LETTER_QUEUE_B_ROUTING_KEY delay.queue.demo.deadletter.delay_60s.routing_key;public static final String DEAD_LETTER_QUEUE_A_NAME delay.queue.demo.deadletter.queue_a;public static final String DEAD_LETTER_QUEUE_B_NAME delay.queue.demo.deadletter.queue_b; 2.2 创建延迟交换器 // 注册延迟交换器delayExchangeBean(delayExchange)public DirectExchange delayExchange(){return new DirectExchange(DELAY_EXCHANGE_NAME);} 2.3 创建延迟队列 这里的延迟队列需要我们额外的配置一些参数用于和死信队列进行信息发送。这里我是用了两种不同的方式构建延迟队列A和延迟队列B在延迟队列A种我没有设置TTL参数而是通过RabbitMQ的延迟插件实现的而延迟队列B我设置了TTL为10000ms也就是十秒十秒内消息如果没有被消费掉就会发送到死信队列。 // 注册延迟队列A 还要绑定死信交换器和死信routingABean(delayQueueA)public Queue delayQueueA(){MapString,Object args new HashMap();args.put(x-dead-letter-exchange,DEAD_LETTER_EXCHANGE);args.put(x-dead-letter-routing-key,DEAD_LETTER_QUEUE_A_ROUTING_KEY);//args.put(x-message-ttl,6000);return QueueBuilder.durable(DELAY_QUEUE_A_NAME).withArguments(args).build();}// 注册延迟队列B 还要绑定死信交换器和死信routingBBean(delayQueueB)public Queue delayQueueB(){MapString,Object args new HashMap();args.put(x-dead-letter-exchange,DEAD_LETTER_EXCHANGE);args.put(x-dead-letter-routing-key,DEAD_LETTER_QUEUE_B_ROUTING_KEY);args.put(x-message-ttl,10000);return QueueBuilder.durable(DELAY_QUEUE_B_NAME).withArguments(args).build();} 2.4 延迟队列绑定延迟交换器 // 延迟队列A绑定交换器Beanpublic Binding delayQueueABinding(Qualifier(delayQueueA) Queue queue, Qualifier(delayExchange) DirectExchange delayExchange){return BindingBuilder.bind(queue).to(delayExchange).with(DELAY_QUEUE_ROUTING_A_NAME);}// 延迟队列B绑定交换器Beanpublic Binding delayQueueBBinding(Qualifier(delayQueueB) Queue queue,Qualifier(delayExchange) DirectExchange delayExchange){return BindingBuilder.bind(queue).to(delayExchange).with(DELAY_QUEUE_ROUTING_B_NAME);} 2.5 死信队列配置 与延迟队列不同的是死信队列并没有配置延迟参数。 // 注册死信队列ABean(deadLetterQueueA)public Queue deadLetterQueueA(){return new Queue(DEAD_LETTER_QUEUE_A_NAME);}// 注册死信队列BBean(deadLetterQueueB)public Queue deadLetterQueueB(){return new Queue(DEAD_LETTER_QUEUE_B_NAME);}// 注册死信交换器Beanpublic DirectExchange deadLetterExchange(){return new DirectExchange(DEAD_LETTER_EXCHANGE);}// 死信队列A绑定死信交换器Beanpublic Binding deadLetterQueueABinding(Qualifier(deadLetterQueueA) Queue queue, Qualifier(deadLetterExchange) DirectExchange deadLetterExchange){return BindingBuilder.bind(queue).to(deadLetterExchange).with(DEAD_LETTER_QUEUE_A_ROUTING_KEY);}// 死信队列B绑定死信交换器Beanpublic Binding deadLetterQueueBBinding(Qualifier(deadLetterQueueB) Queue queue, Qualifier(deadLetterExchange)DirectExchange deadLetterExchange){return BindingBuilder.bind(queue).to(deadLetterExchange).with(DEAD_LETTER_QUEUE_B_ROUTING_KEY);} 到此为止RabbitMQ的组件配置完成。 3. 添加application.yml server:port: 8081 spring:application:name: test-rabbitmq-producerrabbitmq:host: 127.0.0.1port: 5672username: guestpassword: guest 4. 添加RabbitMQListener 消费者 下方的代码一共有两个消费者一个消费者获取死信队列A中的消息另一个消费者获取死信队列B中的消息。 Component public class DeadLetterQueueConsumer {public static final Logger LOGGER LoggerFactory.getLogger(DeadLetterQueueConsumer.class);RabbitListener(queues DeadRabbitConfig.DEAD_LETTER_QUEUE_A_NAME,ackMode MANUAL)public void receiveA(Message message, Channel channel) throws IOException {String msg new String(message.getBody());LOGGER.info(当前时间{},死信队列A收到消息{}, new Date().toString(), msg);System.out.println(message.getMessageProperties().getDeliveryTag());channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);}RabbitListener(queues DeadRabbitConfig.DEAD_LETTER_QUEUE_B_NAME,ackMode MANUAL)public void receiveB(Message message, Channel channel) throws IOException {String msg new String(message.getBody());LOGGER.info(当前时间{},死信队列B收到消息{}, new Date().toString(), msg);channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} } 5. 创建DelayMessageSender 这里采用的就是两种不同的方式一种方式是使用插件来延迟消息的发送另一种是通过TTL参数。 Component public class DelayMessageSender {ResourceRabbitTemplate rabbitTemplate;public void sendMessage(String msg,Integer delayTimes){switch (delayTimes){case 6:rabbitTemplate.convertAndSend(DeadRabbitConfig.DELAY_EXCHANGE_NAME, DeadRabbitConfig.DELAY_QUEUE_ROUTING_A_NAME,msg,new MessagePostProcessor() {Overridepublic Message postProcessMessage(Message message) throws AmqpException {message.getMessageProperties().setExpiration(String.valueOf(6000));return message;}});break;case 10:rabbitTemplate.convertAndSend(DeadRabbitConfig.DELAY_QUEUE_B_NAME,msg);break;}} }6. 创建Controller RestController RequestMapping(/student) public class StudentController {AutowiredDelayMessageSender messageSender;RequestMapping(/send-message)public String sendMessage(String msg,Integer delayTimes){System.out.println(new Date());messageSender.sendMessage(msg,delayTimes);return 发送成功;} } 7.测试 在浏览器中输入以下地址进入RabbitMQ界面。账号密码都是guest。 http://localhost:15672/ 先来看看我们的初始队列。这里是什么都没有的。 然后我们启动项目后在看。我们刚才创建出来的四个队列全部都被加载了出来。 使用PostMan发送一次请求。 我们的请求在17s的时候发送到后端消息打印在23s说明我们的延迟队列有效果。 接下来我们测试10s的延迟队列。 10s后死信队列B成功的接收到了消息。 四、死信队列的应用场景 延迟队列通常用于需要延迟执行某些任务或触发某些事件的场景。例如在电子商务中可以使用延迟队列实现订单超时未支付自动取消功能。 1.订单创建 用户下单后系统生成订单并将订单信息发送到一个普通队列同时设置一个TTLTime-To-Live为30分钟。这个队列配置了死信交换机Dead Letter Exchange, DLX当消息过期后会被转发到死信队列。 2.等待支付 在30分钟内用户可以完成支付。如果用户在30分钟内支付完成系统会从普通队列中移除对应的消息并正常处理订单。 3.订单超时处理 如果用户未在30分钟内完成支付消息会自动过期并转发到死信交换机进而转发到死信队列。 4.取消订单 系统有一个专门的消费者监听死信队列。当有消息进入死信队列时消费者会自动处理这些消息即取消订单、释放库存并通知用户订单已取消。 5.定时任务可选 虽然死信队列已经提供了超时订单的处理但为了防止消息丢失或处理延迟可以设置一个定时任务定期检查订单状态确保所有超时未支付的订单都得到了处理。
- 上一篇: 怎么让公司建设网站做电影网站用什么服务器比较好
- 下一篇: 怎么让网站被百度收录宿迁做网站哪家好
相关文章
-
怎么让公司建设网站做电影网站用什么服务器比较好
怎么让公司建设网站做电影网站用什么服务器比较好
- 技术栈
- 2026年03月21日
-
怎么让别人访问自己做的的网站网页版抖音入口
怎么让别人访问自己做的的网站网页版抖音入口
- 技术栈
- 2026年03月21日
-
怎么让百度收录自己的网站班级网站制作建设的设计和作用
怎么让百度收录自己的网站班级网站制作建设的设计和作用
- 技术栈
- 2026年03月21日
-
怎么让网站被百度收录宿迁做网站哪家好
怎么让网站被百度收录宿迁做网站哪家好
- 技术栈
- 2026年03月21日
-
怎么让自己的网站稍微变前面点做网站学完html
怎么让自己的网站稍微变前面点做网站学完html
- 技术栈
- 2026年03月21日
-
怎么删除织梦做的网站百度关键词优化软件如何
怎么删除织梦做的网站百度关键词优化软件如何
- 技术栈
- 2026年03月21日
