SpringCloudStream4.0使用StreamBridge实现延时队列

本文详细介绍了如何在SpringBoot项目中使用RabbitMQ3.9版本,包括生产者和消费者的配置,以及死信队列的设置。通过YAML配置文件展示了如何管理消息分组、延时和消费组,以实现未支付订单自动失效功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、版本依赖

二、使用步骤

1.生产者

1.1生产者yml配置

1.1.1生产者yml配置说明

2.消费者

2.1消费者yml配置

2.2.2小配置配置说明

3.RabbitMQ客户端以及代码运行实例

总结



前言

RabbitMQ 中文官方文档 (RabbitMQ 中文官方文档)

本文使用RabbitMQ作为使用案例,实际业务中为了实现未支付订单自动失效。


提示:以下是本篇文章正文内容,下面案例可供参考

一、版本依赖

RabbitMQ使用的是3.9,安装了死信插件。

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
            <version>$4.0.0</version>
        </dependency>

二、使用步骤

实体类:

package com.iterative.learning.rabbitmq;


public class RabbitMQ {

    private String name;
    private long sendTime;

    public RabbitMQ() {
    }

    public RabbitMQ(String name, long sendTime) {
        this.name = name;
        this.sendTime = sendTime;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getSendTime() {
        return sendTime;
    }

    public void setSendTime(long sendTime) {
        this.sendTime = sendTime;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sendTime=" + sendTime +
                '}';
    }
}

1.生产者

代码如下(示例):

import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;

@RestController
public class SystemLogController extends BaseController {

    @Resource
    private StreamBridge streamBridge;

    // 发送分组消息
    @PostMapping("/group")
    public String sendGroupMessage() {
        // 生产消息
        streamBridge.send("myGroup-out-0", JSONUtil.toJsonStr(new RabbitMQ("myGroup-out-0", System.currentTimeMillis())));
        return "SUCCESS";
    }

    //发送延时消息
    @PostMapping("/deadLetter")
    public String deadLetter() {
        Message<RabbitMQ> message = MessageBuilder.withPayload(new RabbitMQ("DEV_MESSAGE_TOPIC", System.currentTimeMillis()))
                //.setExpirationDate(5000L) yml也可以配置取最大值
                .build();
        streamBridge.send("deadLetter-out-0", message);
        System.out.println("/deadLetter:发送时间" + DateTimeUtils.getDataStr());
        return "SUCCESS";
    }

 }
1.1生产者yml配置
spring:
  rabbitmq:
    host: localhost
    port: 5673
    username: rabbitmq
    password: 123456
  cloud:
    stream:
      bindings:
        #广播分组-集群多台MQ解决重复消费
        myGroup-out-0:
          destination: my-group-topic
          binder: rabbit
        deadLetter-out-0:
          destination: DEV_MESSAGE_TOPIC
          #content-type: application/json #默认为json
          binder: rabbit
          group: DEAD
          producer:
            required-groups:
              - deadLetter-group
      rabbit:
        bindings:
          deadLetter-out-0:
            producer:
              #延时队列的延时时间,设置了这个属性[setExpirationDate(11000L)]ttl就会失效
              ttl: 10000
              #开启死信队列
              auto-bind-dlq: true
              #死信交换机,原名_DLX
              dead-letter-exchange: DEV_MESSAGE_TOPIC_DLX
              #死信队列名称
              dead-letter-queueName: DEV_MESSAGE_TOPIC_DLX.DEAD
1.1.1生产者yml配置说明

2.消费者

代码如下(示例):

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.Message;
@Configuration
public class MessageConsumers {
    private static final Logger log = LoggerFactory.getLogger(MessageConsumers.class);


    // 消费分组消息
    @Bean
    public Consumer<RabbitMQ> myGroup() {

        return message -> {
            log.info("myGroup接收分组消息:{}", message);
        };
    }
    //延时消息
    @Bean
    public Consumer<Message<RabbitMQ>> handleTaskDelayed() {
        return message -> {
            RabbitMQ payload = message.getPayload();
            long time = (System.currentTimeMillis() - payload.getSendTime()) / 1000;
            System.out.println(payload + ",handleTaskDelayed耗时:" + time);
        };
    }

}

2.1消费者yml配置

spring:
  rabbitmq:
    host: localhost
    port: 5673
    username: rabbitmq
    password: 123456
  cloud:
    function:
      definition: handleTaskDelayed;myGroup
    stream:
      bindings:
          #消费方的分组-集群多台MQ解决重复消费
        myGroup-in-0:
          binder: rabbit
          destination: my-group-topic
          group: ${spring.application.name}

        #处理延迟任务
        handleTaskDelayed-in-0:
          destination: DEV_MESSAGE_TOPIC_DLX
          binder: rabbit
          #发送方的分组,要一致否则无法消费
          group: DEAD
      rabbit:
        bindings:
          handleTaskDelayed-in-0:
            consumer:
              exchange-type: direct

2.2.2消费者配置配置说明

3.RabbitMQ客户端以及代码运行实例

图1RabbitMQ交换机

图2MQ队列(是配置的10秒下去被消费,懒得再去截图了)

图3生产者打印

图4消费者打印


总结

以上就是今天要讲的内容,本文仅仅简单介绍了RabbitMQ的使用,近期在学习4.0,国内基本上找不到yml配置的,自己踩了两天坑分享出来,希望对你有所帮助。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值