@[TOC](【微服务学习】spring-cloud-starter-stream 4.x 版本的使用(rocketmq 版))
1. 区别
3.x 版本
3.x 版本的使用, 都是基本上都是通过注解
@EnableBinding
@Input
@Output
@StreamListener
等注解来实现对不同信道的绑定.
具体使用可参考: https://www.cnblogs.com/xfeiyun/p/16229303.html
4.x 版本
4.x 版本删除了这些注解.
具体的使用采用隐式绑定的方式(虽然文档上说不推荐这种方式,但是我也没找到其他实现方式)
具体文档参考: https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html
2. 使用
2.1 消息发送者
消息发送, 有两种方式.
方式一: 使用 StreamBridge streamBridge; 往指定信道发送消息.
方式二: 通过隐式绑定信道, 注册 Bean 发送消息
2.1.1 使用 StreamBridge streamBridge; 往指定信道发送消息
@Resource
private StreamBridge streamBridge;
// im-out 为信道名称 与 yml 中的配置绑定 spring.cloud.stream.bindings.im-out
boolean b = streamBridge.send("im-out", "要发送的消息");
2.1.2 通过隐式绑定信道, 注册 Bean 发送消息
@Bean
//注意: 此处的 im 对象是与 spring.cloud.stream.function.bindings.im-out-0 绑定的.
//其中 -out-0 是 4.x 的一种约定.
public Supplier<String> im() {
return () -> "要发送的信息";
}
绑定关系大致如图:
2.2 消息接收者
消息接收, 目前我只得到一种可行性方式, 就是隐式绑定, 与消息发送者类似
另一种方式, 使用: @ServiceActivator(outputChannel = "im") 测试发现, 只能实现异步, 并不走 MQ 发送消息.
@Bean
public Function<String, String> toUpperCase() {
return String::toUpperCase;
}
@Bean
public Consumer<String> sout() {
return s -> {
//消息处理者
System.out.println("接收到的消息切转换大写的结果为: " + s);
};
}
- 注意: 多个方法之间可以使用 “|” 间隔, 但是绑定时 多个需要按顺序写. 其中 -in-0 是一种约定
3. 实践
首先, 说一下, 我的理解, spring 更多的是往响应式异步编程的方式发展.
spring 文档中 大部分的 demo 都是采用 FLux 和 Mono 这样的响应式异步编程实现的.
3.1 消息发送者隐式绑定存在的问题
-
Q: 通过 2.1.2 发现, 消息的发送是通过注册 Bean 的方式, 那是不是在服务启动的时候,
就已经必须编辑好要发送的内容进行发送, 跟现实使用不符. -
A: 可以通过 Flux 异步将 FluxSink 暴露出去使用. (不知道怎么描述, 直接看例子吧)
3.2 场景
首先, 基础框架是我之前写的一个 IM 及时聊天框架, 所以, 场景就借助这个框架实现.
主要关注就是如何发送消息, 和如何接收消息.
3.2.1 消息发送者
- maven 依赖