注意:
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小时多
官网文档:
代码:
自定义消息源:
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上发出的消息