spring cloud stream rocketmq 多数据源,连接多个rocket集群

之前项目中有个需求,在一个服务中,需要连接两个不同的rocketmq实例,查找了好久的资料,终于通过Google找出来了,以后有条件的还是使用Google吧,百度真的百度不出来

maven依赖:
注意: 只对以下依赖版本有效,其他的版本没试过,不同的版本可能不一样

 <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.boot.version>2.3.7.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR9</spring.cloud.version>
        <spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
                <version>2.2.9.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
server:
  port: 10086
spring:
  cloud:
    stream:
      binders:
        binder1:
          type: rocketmq
          environment:
            spring.cloud.stream.rocketmq:
              binder:
                name-server: localhost:9876
                #          accessKey: skXXXX
                #          secretKey: skXXXX
                enable-msg-trace: false
                group: demo-group-1
              bindings:
                topic-demo-out-0:
                  producer:
                    group: delayed-group-1
                    sync: true
                handleDemoMsg-in-0:
                  consumer:
                    enable: true
                    broadcasting: false
                    orderly: false
                handleCompletedMsg-in-0:
                  consumer:
                    enable: true
                    broadcasting: false
                    orderly: false
        binder2:
          type: rocketmq
          environment:
            spring.cloud.stream.rocketmq:
              binder:
                name-server: localhost:9876
                # accessKey: akxxxxxxx
                # secretKey: skxxxxxxx
                enable-msg-trace: false
                group: demo-group-2
              bindings:
                topic-demo2-out-0:
                  producer:
                    group: delayed-group-2
                    sync: true
      default-binder: binder1
      bindings:
        topic-demo-out-0:
          destination: topic-demo
        topic-demo2-out-0:
          destination: topic-demo2
          binder: binder2 # 如果指定了binder,就走指定的,不指定就走默认的binder1,上边设置的: default-binder: binder1
        handleDemoMsg-in-0:
          content-type: application/json
          destination: topic-demo
          group: demo-group-1
      function:
        definition: handleDemoMsg,handleCompletedMsg

发送消息

package com.learning.config;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageConst;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.stereotype.Component;
import org.springframework.util.MimeTypeUtils;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@Component
@Slf4j
public class MsgSender {
    @Resource
    private StreamBridge streamBridge;
	//通用的消息发送,由调用方指定msg key
    public void sendMsg(String bindingName, String msgKey, String tag, Integer delayTimeLevel, String msg) {
        Map<String, Object> headers = new HashMap<>();
        headers.put(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON);
        headers.put(MessageConst.PROPERTY_TAGS, tag);
        headers.put(MessageConst.PROPERTY_KEYS, msgKey);
        if(null != delayTimeLevel) {
            headers.put(MessageConst.PROPERTY_DELAY_TIME_LEVEL, delayTimeLevel);
        }
        final Message message = new GenericMessage(JSONObject.parseObject(msg), new MessageHeaders(headers));
        streamBridge.send(bindingName, message);
        log.info("消息发送成功,消息Key:{}", msgKey);
    }

    /**
     * 发送普通消息,自动生成msg key
     * @param bindingName
     * @param msgObject
     */
    public boolean sendMsg(String bindingName, Object msgObject) {
        Map<String, Object> headers = new HashMap<>();
        headers.put(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON);
        headers.put(IDUtils.TraceId, IDUtils.getId());
        headers.put(MessageConst.PROPERTY_KEYS, IDUtils.generateDatetimeUuidId());

        final Message message = new GenericMessage(JSONObject.toJSON(msgObject), new MessageHeaders(headers));
        boolean send = streamBridge.send(bindingName, message);
        log.info("消息发送成功,消息Key:{}", IDUtils.getId());
        return send;
    }

	//发送延时消息,自动生成msg key
    public void sendDelayMsg(String bindingName, Integer delayTimeLevel, Object msgObject) {
        Map<String, Object> headers = new HashMap<>();
        headers.put(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON);
        headers.put(IDUtils.TraceId, IDUtils.getId());
        headers.put(MessageConst.PROPERTY_KEYS, IDUtils.generateDatetimeUuidId());
        headers.put(MessageConst.PROPERTY_DELAY_TIME_LEVEL, delayTimeLevel);
        final Message message = new GenericMessage(JSONObject.toJSON(msgObject), new MessageHeaders(headers));
        streamBridge.send(bindingName, message);
        log.info("消息发送成功,消息Key:{}", IDUtils.getId());
    }
}

测试:


@RestController
public class RocletMqController {

    @Resource
    private MsgSender msgSender;
    
    @GetMapping("/sendMsg")
    public boolean sendMsgByStream() {
	    //sendMsg方法的第一个参数是配置文件中自定义的binder名称,
	    //第二个参数是object类型的消息体
        return msgSender.sendMsg("topic-demo-out-0", "test1");
    }
}

我也是根据kafka配置,照搬到rocketmq中,spring cloud stream的好处就是可以很方便的切换不同类型的消息队列,kafka,rabbit,rocketmq配置都差不多,不同的队列类型,引入不同的starter,即:spring-cloud-starter-stream-rocketmq依赖,很方便

参考:
1, https://cloud.spring.io/spring-cloud-stream/spring-cloud-stream.html#multiple-systems
2, https://solace.community/discussion/1398/multiple-binder-configuration
3, https://github.com/spring-cloud/spring-cloud-stream-samples/blob/main/multi-binder-samples/multi-binder-two-kafka-clusters/src/main/resources/application.yml

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 中使用 RocketMQ,一个 Consumer Group 可以订阅多个 Topic。以下是如何在 Spring Boot 中配置一个 Consumer Group 订阅多个 Topic 的步骤: 1. 创建 Consumer Group:在 Spring Boot 项目中,可以通过在配置文件(如 application.properties 或 application.yml)中配置 Consumer Group 来创建 Consumer Group。例如,在 application.properties 中添加以下配置: ``` rocketmq.consumer.group=myGroup ``` 2. 订阅多个 Topic:在 Spring Boot 项目中,可以通过在配置文件中配置多个 Topic 来订阅多个 Topic。例如,在 application.properties 中添加以下配置: ``` rocketmq.consumer.topics=topic1,topic2,topic3 ``` 3. 创建 Consumer:在 Spring Boot 项目中,可以使用 RocketMQSpring Boot Starter 来创建 Consumer。首先需要在 pom.xml 文件中添加以下依赖: ``` <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>${rocketmq.version}</version> </dependency> ``` 然后,在 Spring Boot 项目中创建一个 RocketMQ 的 Consumer 类,用于处理消息。例如: ``` @Component @RocketMQMessageListener(consumerGroup = "${rocketmq.consumer.group}", topic = "${rocketmq.consumer.topics}") public class MyConsumer implements RocketMQListener<String> { @Override public void onMessage(String message) { // 处理消息 } } ``` 在上面的示例中,使用 `@RocketMQMessageListener` 注解来标识这是一个 RocketMQ 的 Consumer 类,并且配置 Consumer Group 和 Topic。然后,实现 `RocketMQListener` 接口来处理消息。 通过以上步骤,就可以在 Spring Boot 中配置一个 Consumer Group 订阅多个 Topic 了。需要注意的是,RocketMQ 的配置方法可能会随着版本的升级而有所改变,具体的操作步骤需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值