SpringBoot RabbitMq 使用

本文介绍如何利用SpringBoot和RabbitMQ实现延迟消息处理,通过TTL和DLX特性,确保消息在指定时间后被正确处理。详细步骤包括引入依赖、配置RabbitMQ、创建交换器和队列,以及测试发送和接收延迟消息。

SpringBoot RabbitMq 使用

最近业务场景需要,进行订单支付后,等待指定时间后检查订单是否支付完成,支付失败的话取消订单;支付成功不做其他操作;
通过面向百度开发,决定使用RabbitMq 作为消息中间件实现需要的功能;

通过资料翻阅知道,RabbitMq并没有延迟消息发送这个功能的;但可以通过其的两个特性TTL 和DLX 实现;
TTL :RabbitMq 运行我们为消息获取队列设置有效期; 当消息和队列同时设置时,以小值为准;
DLX:设置在队列上,作用是在于当队列中的消息被拒绝,过期获取队列达到最大长度被排出时,将消息发送到指定的交换器中,通过设置指定好的路由键,到底要接收消息的队列;
(这里个人理解是这样的,若有不当或错误的地方,望指出赐教;)

代码实现

  • 引入依赖,配置RabbitMq
  • 创建交换器和队列,并配置队列属性实现DLX
  • 队列绑定交换器
  • 测试发送TTL消息到设置DLX属性的队列
  • 监听接收到转发消息的队列,实现接收延迟消息

第一步,引入依赖

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

配置RabitMq

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: test
    password: test
    virtual-host: my_test

创建一个配置类,配置创建交换器和队列

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;

/**
 * 2019/8/21 14:21
 *
 * @Author lzm
 */
@Configuration
public class DmRabbitMqConfig {


    /**
     * 交换器
     */
    public final static String DM_EXC = "DM_EXC";

    /**
     * 接收DLX转发消息的队列名字,同时作为路由键
     */
    public final static String DM_QUEUE = "DM_QUEUE";

    /**
     * 配置DLX属性的队列名字,同时作为路由键
     */
    public final static String DM_DLX_QUEUE = "DM_DLX_QUEUE";

    /**
     * 创建一个直接模式的交换器
     * @return
     */
    @Bean
    public DirectExchange directExchange(){

        return new DirectExchange(DM_EXC,true,false);
    }

    /**
     * 创建一个普通的队列
     * @return
     */
    @Bean
    public Queue dmQueue(){
        Queue queue = new Queue(DM_QUEUE,true,false,false);
        return queue;
    }

    /**
     * 创建一个队列,并配置DLX 属性,
     * 配置信息可查阅官网:https://www.rabbitmq.com/dlx.html
     * @return
     */
    @Bean
    public  Queue dlxQueue(){
        Map<String,Object> map = new HashMap<>();

        map.put("x-dead-letter-exchange",DM_EXC);
        map.put("x-dead-letter-routing-key",DM_QUEUE);
        Queue queue = new Queue(DM_DLX_QUEUE,true,false,false,map);
        return queue;
    }

    // 两个队列和交换器进行绑定

    @Bean
    public Binding bindingDmQueue(){
        return BindingBuilder.bind(dmQueue()).to(directExchange()).with(DM_QUEUE);
    }

    @Bean
    public Binding bindinDlxQueue(){
        return BindingBuilder.bind(dlxQueue()).to(directExchange()).with(DM_DLX_QUEUE);
    }
}

写个测试类,发送消息进行测试;(进行消息发送时,交换器和队列必须是存在的了,否则会保错;)

@RunWith(SpringRunner.class)
@SpringBootTest
public class DmApplicationTests {

    @Autowired
    private RabbitTemplate template;

    @Test
    public void contextLoads() {
       template.convertAndSend(DmRabbitMqConfig.DM_EXC,DmRabbitMqConfig.DM_DLX_QUEUE, "我是5秒前发生的消息,5秒前是"+LocalDateTime.now(), message -> {
           message.getMessageProperties().setExpiration("5000");
           return message;
       });
    }

写个消息接收类

@Component
public class Test {

    @RabbitListener(queues = DmRabbitMqConfig.DM_QUEUE)
    @RabbitHandler
    public void get(String msg){
        System.out.println("接收到消息,现在时间是:"+ LocalDateTime.now());
        System.out.println(msg);

  }

测试结果

接收到消息,现在时间是:2019-08-21T14:57:22.513
我是5秒前发生的消息,5秒前是2019-08-21T14:57:17.470

### 如何在 Spring Boot 中集成和使用 RabbitMQ 进行消息传递 #### 安装和配置 RabbitMQ 为了使 Spring Boot 应用程序能够与 RabbitMQ 协同工作,需先安装并启动 RabbitMQ 服务。这一步骤通常涉及下载 RabbitMQ 并按照官方文档完成其设置过程[^1]。 #### 添加依赖项到 `pom.xml` 为了让 Spring Boot 支持 RabbitMQ 功能,在项目的 Maven 构建文件 (`pom.xml`) 中加入如下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 此操作使得开发者可以利用 Spring AMQP 抽象层来简化对不同消息代理的支持,而无需关心底层协议细节[^2]。 #### 配置 RabbitMQ 参数 接着定义连接至 RabbitMQ 所必需的各项参数,一般是在 application.properties 或者 application.yml 文件内指定这些属性值。例如: ```yaml spring: rabbitmq: host: localhost port: 5672 username: guest password: guest ``` 上述配置指定了主机地址、端口号以及认证凭证等基本信息,确保应用程序能成功建立与 RabbitMQ Server 的会话链接。 #### 创建生产者发送消息 编写一个简单的 Java 类作为消息生产者,负责向特定队列推送数据包。下面是一个基本的例子展示怎样封装一条字符串形式的消息并通过默认交换器路由给名为 "hello" 的队列: ```java import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; @Service public class Producer { private final AmqpTemplate amqpTemplate; public Producer(AutoWired AmqpTemplate amqpTemplate){ this.amqpTemplate = amqpTemplate; } @Bean Queue queue() { return new Queue("hello"); } public void sendMessage(String message) { System.out.println("[x] Sent '" + message + "'"); amqpTemplate.convertAndSend("hello", message); } } ``` 这段代码展示了如何声明一个新的队列实例,并通过调用 `convertAndSend` 方法把待传输的内容打包成二进制流注入目标队列中去[^3]。 #### 实现消费者接收消息 最后一步就是设计监听器类等待来自某个具体队列的通知事件发生时触发回调函数执行业务处理流程。这里给出了一种基于注解的方式实现自动化的消费行为模式: ```java package cn.juwatech.messaging; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class Consumer { @RabbitListener(queues = {"hello"}) public void listen(String message) { System.out.println("[x] Received '" + message + "'"); // Add your processing logic here. } } ``` 每当有新条目进入 “hello” 队列之后就会激活这里的 `listen()` 函数进而打印接收到的数据内容出来供调试查看之用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值