Spring Cloud Stream 集成 RocketMQ

注意:

spring boot 版本太高,与Spring Cloud Stream版本不一致可能会导致报错,类找不到。非法状态错误等。 我这里pom.xml文件给出了,boot的版本,启动不报错。

 参考文章:

Spring Cloud Stream 集成 RocketMQ - 知乎Spring Cloud Stream 是什么? 它是什么 Spring Cloud Stream 是一个构建高度可扩展的事件驱动微服务的框架,与共享消息系统相连。 该框架提供了一个灵活的编程模型,它建立在已经建立和熟悉的 Spring 用法和最佳…https://zhuanlan.zhihu.com/p/137075598参考视频:硬核干货!轻松搞定Stream-Spring Cloud全家桶之消息驱动组件Stream教学最新版-(附配套资料及笔记)_哔哩哔哩_bilibili需要视频配套资料及源码看UP主页简介去获取呐!整理不易,跪求大家点个一键三连(点赞、投币和收藏),UP主会持续输出高质量的硬核视频哦~https://www.bilibili.com/video/BV1BV411n7R9?from=search&seid=905728909716280606&spm_id_from=333.337.0.0

这个视频讲的很详细。有消息分组,消息分区,时长大约1小时多

官网文档:

spring-cloud-alibaba/readme-zh.md at master · alibaba/spring-cloud-alibaba · GitHubSpring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware. - spring-cloud-alibaba/readme-zh.md at master · alibaba/spring-cloud-alibabahttps://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/rocketmq-example/readme-zh.md

代码:

自定义消息源:

package com.example.demo2.config;

import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;

public interface MySource {
    /**
     * 如果配置文件没有spring.cloud.stream.bindings.output.destination=test-topic ;output就是topic
     * output必须上边长串的output一致
    */
    String OUTPUT = "output";

    @Output(OUTPUT)
    MessageChannel output();
}

自定义消息接受

package com.example.demo2.config;

import org.springframework.cloud.stream.annotation.Input;
import org.springframework.messaging.SubscribableChannel;

public interface MySink {
    /**
     * 和MySource一样。input一致
     */
    String INPUT = "input";

    @Input(INPUT)
    SubscribableChannel input();
}

 接收消息类

Mypackage com.example.demo2.receive;

import com.example.demo2.config.MySink;
import org.apache.rocketmq.common.message.MessageConst;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * @author admin
 */
@Component
@EnableBinding(MySink.class)
public class ReceiveMessage  {


    @StreamListener(MySink.INPUT)
    public void res(String message)  {
        System.out.println(message);
    }
}

 发送消息类

package com.example.demo2.send;

import com.example.demo2.config.MySource;
import org.apache.rocketmq.common.message.MessageConst;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * @author admin
 */
@Component
@EnableBinding(MySource.class)
public class ProducerRunner implements CommandLineRunner {

    @Autowired
    private MySource output;
    // 获取name为output的binding


    @Override
    public void run(String... args) throws Exception {
        Map<String, Object> headers = new HashMap<>();
        headers.put(MessageConst.PROPERTY_TAGS, "tagStr");
        String msg = "dddd";
        //创建消息方式1
        Message message = MessageBuilder.createMessage(msg, new MessageHeaders(headers));
        //创建消息方式2
        Message message2 = MessageBuilder.withPayload(msg).setHeader("MessageConst.PROPERTY_TAGS","header-msg").build();
        //发送消息
        output.output().send(message);
        System.out.println("fassss==========");
    }
}

测试方法

package com.example.demo2.web;

import com.example.demo2.send.ProducerRunner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.web.bind.annotation.*;

import java.util.function.Consumer;

/**
 *
 * 功能
 */
@RestController
@RequestMapping("/user")
public class TestController {

    @Autowired
    private ProducerRunner producerRunner;

    @GetMapping("/send")
    public String send() {
        CommandLineRunner runnable = producerRunner::run;
        System.out.println(runnable);
        return "ok";
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <!--<version>2.5.4</version>-->
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.example</groupId>
    <artifactId>demo2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo2</name>
    <description>demo2</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
            <version>2.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-stream-binder-rocketmq</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

一定看看前边的 文章

补录:

接收带条件的消息

监听上要配置上

condition = "headers['rocketmq_TAGS']=='XIN'"
@Slf4j
@Component
@EnableBinding(value = {MySink.class})
public class OrderEventHandler {

    @Autowired
    private OrderService orderService;

    /**
     * erp 订单创建成功发出的消息
     * , condition = "headers['tag']=='XIN'"
     * @param message erp消息
     */
    @StreamListener(value = MySink.ORDER_INPUT, condition = "headers['rocketmq_TAGS']=='XIN'")
    public void handleErpOrderCreatedEvent(Message<OrderEvent> message) {
        OrderEvent event = message.getPayload();
       
        log.debug("订单创建成功发出的消息: {}", event);
        orderService.handleOrderCreatedEvent(event);

    }

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、付费专栏及课程。

余额充值