RocketMQ(二)SpringCloud集成RocketMQ样例


一、引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>

二、创建producer模块

关键配置文件,使用cloud框架,还需要配置注册中心等配置,这里不作展示,文末我会上传代码


--- # rocketmq 配置
spring:
  cloud:
    stream:
      rocketmq:
        binder:
          # rocketmq 地址
          name-server: 192.168.48.13:9876,192.168.48.13:9877
        bindings:
          demo-out-0:
            producer:
              # 必须得写
              group: test-group
              # 开启延迟发送
              sync: true
      bindings:
        demo-out-0:
          content-type: application/json
          destination: stream-test-topic
          group: test-group
          binder: rocketmq
          

producer类,发送的地址的配置,注意跟配置文件保持一致即可。

import com.geovis.domain.MQMessage;
import org.apache.rocketmq.common.message.MessageConst;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

import java.util.UUID;

@Component
public class RMQStreamProducer {
    
    

    @Autowired
    private StreamBridge streamBridge;

    public void sendMsg(String msg) {
    
    
        // 构建消息对象
        MQMessage mqMessage = new MQMessage().setMsgId(UUID.randomUUID().toString()).setMsgText(msg);
        streamBridge.send("demo-out-0", MessageBuilder.withPayload(mqMessage).build());
    }

    /**
     * 发送延迟消息
     * @param msg
     */
    public void sendDelayMsg(String msg) {
    
    
        // 构建消息对象
        MQMessage mqMessage = new MQMessage().setMsgId(UUID.randomUUID().toString()).setMsgText(msg);
        Message<MQMessage> message = MessageBuilder.withPayload(mqMessage).setHeader(MessageConst.PROPERTY_DELAY_TIME_LEVEL,4).build();
        streamBridge.send("demo-out-0", message);
    }
}

注意:RocketMQ延时消息的延迟时长不支持随意时长的延迟,是通过特定的延迟等级来指定的。

默认支持18个等级的延迟消息,延时等级定义在RocketMQ服务端的MessageStoreConfig类中的如下变量中:

// MessageStoreConfig.java
private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h";
 
//发消息时,设置delayLevel等级即可:msg.setDelayLevel(level)。level有以下三种情况:
level == 0,消息为非延迟消息
1<=level<=maxLevel,消息延迟特定时间,例如level==1,延迟1s
level > maxLevel,则level== maxLevel,例如level==20,延迟2h

例如指定的延时等级为3,则表示延迟时长为10s,即延迟等级是从1开始计数的。

控制类

import com.geovis.producer.RMQStreamProducer;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 测试mq
 */
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/rmq")
public class MqController {
    
    

    private final RMQStreamProducer rmqStreamProducer;

    /**
     * 发送消息Rocketmq
     *
     * @param msg 消息内容
     */
    @GetMapping("/sendMsg")
    public ModelMap sendMsg(String msg) {
    
    
        rmqStreamProducer.sendMsg(msg);
        ModelMap modelMap = new ModelMap();
        modelMap.addAttribute("code","0");
        modelMap.addAttribute("msg","OK");
        return modelMap;
    }

    /**
     * 发送消息Rocketmq
     *
     * @param msg 消息内容
     */
    @GetMapping("/sendDelayMsg")
    public ModelMap sendDelayMsg(String msg) {
    
    
        rmqStreamProducer.sendDelayMsg(msg);
        ModelMap modelMap = new ModelMap();
        modelMap.addAttribute("code","0");
        modelMap.addAttribute("msg","OK");
        return modelMap;
    }

使用postman工具测试
在这里插入图片描述
通过界面可以查看自己发送的数据信息
在这里插入图片描述

三、创建consumer模块

配置文件,还是只列出核心的配置

spring:
  cloud:
    stream:
      function:
        # 重点配置 与 binding 名与消费者对应
        definition: demo

--- # rocketmq 配置
spring:
  cloud:
    stream:
      rocketmq:
        binder:
          # rocketmq 地址
          name-server: 192.168.48.13:9876,192.168.48.13:9877
        bindings:
          demo-in-0:
            consumer:
              # 必须得写
              group: test-group
      bindings:
        demo-in-0:
          content-type: application/json
          destination: stream-test-topic
          group: test-group
          binder: rocketmq

消费者类

import com.geovis.domain.MQMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.function.Consumer;

@Slf4j
@Component
public class RMQStreamConsumer {
    
    

    @Bean
    Consumer<MQMessage> demo() {
    
    
        log.info("初始化订阅");
        return msg -> {
    
    
            log.info("通过stream消费到消息 => {}", msg.getMsgText());
        };
    }
}

原 @Input @OutPut @EnableBinding 已过时,使用函数式编程即可。
写法参考配置文件中的样例,名称需要与方法名称一致。

spring:
  cloud:
    stream:
      function:
        # 重点配置 与 binding 名与消费者对应
        definition: demo

消费的消息如下图

在这里插入图片描述
结尾附上测试源码 源码地址

猜你喜欢

转载自blog.csdn.net/bacawa/article/details/130525467