spring-cloud-stream 集成rocketMq(一) 实现普通消息的发送与接收

使用spring-cloud-steam 来集成rocketMq,来实现消息的发送和接收

准备工作

说明

作者专注分享实用代码,原理性的东西就不分享了,大家自行查找。

spring-cloud-stream 3.1之后,弃用了 @EnableBinding @Input 和@Output等注解,改为采用函数式编程来实现。所以这里的案例是记录如何使用新的模式进行集成rocketMq。

依赖

基于spring-cloud 2020.0.4


 <spring-cloud.version>2020.0.4</spring-cloud.version>
  <dependencyManagement>
        <dependencies>
            <!--整合spring cloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--整合spring cloud alibaba-->
            <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>
        </dependencies>
    </dependencyManagement>
 <!-- 集成spring-cloud-starter-stream-rocketmq -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
        </dependency>

普通消息发送

配置文件。简单说明一下,bindings的配置是基于spring.cloud.stream的,bindings是由binder来生成的,binder是由对接具体的消息中间件自己来实现的,我们这里集成的是rocketmq,所以需要配置spring.cloud.stream.rocketmq.binder

#使用spring-cloud-stream 来操作rocketmq
spring:
  cloud:
    stream:
      default:
        producer:
          use-native-encoding: true
        consumer:
          use-native-encoding: true
      bindings:
        #channel 名称
        sensor-out-0:
        	#destination = topic
          destination: sensor-2
      poller.fixed-delay: 10000

      rocketmq:
        binder:
        #rocketMq的ip和端口地址;
          name-server: xx.xx.xx.xx:xxx;
 

具体发送代码。使用StreamBridge 来发送消息



/**
 * @author kdb
 */
@RestController
@RequestMapping("/test")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@Slf4j
@Api(value = "测试", tags = "测试")
public class TestController {
    private final SysUserService sysUserService; 

    private final StreamBridge streamBridge;


    @GetMapping("sendRocketMqMessage2")
    @ApiOperation(value = "使用springcloudstream发送消息", notes = "传入id")
    public ResultBean sendRocketMqMessage2(@ApiParam(name = "id",value = "id",required = true) Long id) {

        SysUser user = sysUserService.get(id);
		//user是测试类,不重要
		
		//* sensor-out-0是通道的名称,跟yml里面配置的通知名称一致的
        streamBridge.send("sensor-out-0",
                MessageBuilder.withPayload(user)
                .build());

        return ResultBean.data(user);
    }


 }

接收消息

接收消息主要是通过function约定的配置,配合函数式编程来实现的

配置文件yml

#使用spring-cloud-stream 来操作rocketmq
spring:
  cloud:
    stream:
      function:
        definition: receive;receiveUser
      # this default config avoids having to set the property on every binding (see commented section below)
      default:
        producer:
          use-native-encoding: true
        consumer:
          use-native-encoding: true
      bindings:
        receive-in-0:
          destination: sensor-2
          # rocketmq一定要设置group(随便写) 其他的mq可留空
          group: wqb2-group
        receiveUser-in-0:
          destination: send-user
          group: user-group
          consumer:
            use-native-decoding: true

      poller.fixed-delay: 10000

      rocketmq:
        binder:
          #rocketMq的ip和端口地址;
          name-server:  xx.xx.xx.xx:xxx;

消费者代码. 重点说明一下 定义接收者的方法名称很重要,要跟yml里面的function名称一致才行。

import java.util.function.Consumer;

@Configuration
@Slf4j
public class StreamConsumer {


    /**
     * 方法名称就是通道 channel。
     *  跟cloud.stream.function.definition里的值对应
     *
     * @return
     */
    @Bean
    Consumer<SysUser> receive() {
         System.out.println("接收到信息了");
        return s -> log.info("Received Sensor: {}", s);
    }


    @Bean
    Consumer<SysUser> receiveUser() {
        System.out.println("接收到信息了");
        return s -> log.info("接收到了 send-user: {}", s);
    }


}

yml 配置中的receive-in-0 和 receiveUser-in-0 是通道名称,其中receive跟上面的function中的receive是要配置的,至于后面的 ‘in-0’ 是有规则的,in是代表从消息中间消息流入应用程序,应用程序既是消费者。具体规则原理,可以参考下方链接,这里就不再赘述了。

参考:

链接: spring cloud stream 3.1.2 源码搭配rocketmq学习

Spring Cloud StreamSpring Cloud 生态系统中的部分,它提供了种简单且可扩展的方式来构建消息驱动的微服务应用程序。而 RocketMQ款开源的分布式消息中间件,它具有高可靠、高吞吐量、高可扩展性等特点。在 Spring Cloud Stream 中,我们可以通过集成 RocketMQ实现消息驱动的微服务应用程序。 下面是 Spring Cloud Stream 集成 RocketMQ 的详细文档: 1. 添加依赖 首先,我们需要添加 Spring Cloud StreamRocketMQ 的相关依赖。在 pom.xml 文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rocketmq</artifactId> </dependency> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> ``` 2. 配置 RocketMQ 在 application.properties 文件中添加 RocketMQ 的相关配置,例如: ``` spring.cloud.stream.rocketmq.binder.namesrv-addr=127.0.0.1:9876 spring.cloud.stream.rocketmq.binder.group=rocketmq-group rocketmq.name-server=127.0.0.1:9876 rocketmq.producer.group=rocketmq-producer-group rocketmq.consumer.group=rocketmq-consumer-group ``` 3. 定义消息通道 在 Spring Cloud Stream 中,消息是通过消息通道来传递的。我们需要定义输入通道和输出通道,例如: ``` public interface MyChannel { String INPUT = "my_input"; String OUTPUT = "my_output"; @Input(INPUT) SubscribableChannel input(); @Output(OUTPUT) MessageChannel output(); } ``` 4. 发送消息 我们可以通过注入 MessageChannel 来发送消息,例如: ``` @Autowired @Qualifier(MyChannel.OUTPUT) private MessageChannel myOutput; public void sendMessage(String message) { myOutput.send(MessageBuilder.withPayload(message).build()); } ``` 5. 接收消息 我们可以通过注入 SubscribableChannel 来接收消息,例如: ``` @StreamListener(MyChannel.INPUT) public void handleMessage(Message<String> message) { log.info("Received message: {}", message.getPayload()); } ``` 6. 集成 RocketMQ 消费者 我们也可以通过集成 RocketMQ 的消费者来接收消息,例如: ``` @Slf4j @Component @RocketMQMessageListener(consumerGroup = "${rocketmq.consumer.group}", topic = MyChannel.INPUT) public class MyRocketMQConsumer implements RocketMQListener<String> { @Override public void onMessage(String message) { log.info("Received message: {}", message); } } ``` 7. 集成 RocketMQ 生产者 我们也可以通过集成 RocketMQ 的生产者来发送消息,例如: ``` @Slf4j @Component public class MyRocketMQProducer { @Autowired private RocketMQTemplate rocketMQTemplate; public void sendMessage(String message) { rocketMQTemplate.convertAndSend(MyChannel.OUTPUT, message); } } ``` 以上就是 Spring Cloud Stream 集成 RocketMQ 的详细文档。通过这种方式,我们可以快速构建消息驱动的微服务应用程序,并且具有高可靠、高吞吐量、高可扩展性等特点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值