SpringBoot使用RabbitMQ实现延迟队列

需求和目标

商城系统,用户下单后若15分钟内仍未完成支付,则自动取消订单,若已支付,不做其他特殊操作
系统还需要支持即时消息的功能,即发即收。

名词解释

①即时队列:即发即收
②延迟队列:发了消息,没有接收方,只有消息过期后才被处理
③死信队列:延迟队列上的消息过期后,会被自动转发到死信队列中,从而最终达到延迟的目的

实现方式

本文采用RabbitMQ自身属性:
TTL(Time To Live存活时间) + DLX(Dead-Letter-Exchange死信交换机)
实现延迟队列,先将消息发到指定了TTL时长的队列A中,队列A没有消费者,也就是说,队列A中的消息肯定会过期,等消息过期后,就会加入到队列B,也就是死信队列,B队列是有消费者在监听的,一旦收到消息,就进行后续的逻辑处理,从而达到延迟效果。
这种实现方式只能为队列设置消息延迟的时长,不能为每个消息指定延迟时长,粒度比较粗,请注意使用的业务场景!

引入依赖

<!--rabbitmq-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

添加配置文件

分别声明了:即时、延迟、死信的相关信息
其中,延迟和死信是相互配合形成了延迟队列

# rabbitMQ配置
mq:
  rabbit:
    host: 127.0.0.1:5672
    virtualHost: /
    username: testUser
    password: 123456
    normal-exchange: wms_exchange_normal
    normal-queue: wms_queue_normal
    normal-routing-key: wms_routing_key_normal
    delay-exchange: wms_exchange_delay
    delay-queue: wms_queue_delay
    delay-routing-key: wms_routing_key_delay
    dlx-exchange: wms_exchange_dlx
    dlx-queue: wms_queue_dlx
    dlx-routing-key: wms_routing_key_dlx

配置类

package com.nwd.common.config;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class RabbitCon
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值