文件名称 | 版本号 | 作者 | 组件版本 | |
---|---|---|---|---|
流式消息_spring-cloud-starter-stream-rocketmq发送消息 | v1.0.1 | 学生宫布 | 8416837 | SpringBoot 2.1.8.RELEASE spring-cloud-starter-stream-rocketmq 2.1.1.RELEASE |
简介
说明
通道式发布|订阅,如果更换消息中间件技术栈,勿须改动代码。
模式
发布
代码
- 引入依赖,以及其它相关类,当前假设已经有完整项目
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
- 在配置文件配置,或yaml文件:
spring.cloud.stream.rocketmq.binder.name-server=ipv4:9876
# 相当于topic
spring.cloud.stream.bindings.output.destination=zhangsan_msg
spring.cloud.stream.bindings.output.group=zhangsan_msg_group_001
# 订阅
# 相当于topic
# spring.cloud.stream.bindings.input.destination=zhangsan_msg
# spring.cloud.stream.bindings.input.group=lisi-group-consumer_9527
- 通道类
package org.springframework.cloud.stream.messaging;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
public interface Source {
// output与配置对应 ...bindings.output...
String OUTPUT = "output";
@Output(OUTPUT)
MessageChannel output();
}
- 启动类加注解,也可加载在业务类上面
// 可以绑定多个
@EnableBinding({Source.class, Xxx.class, Xyy.class})
- 生产代码,【注意】下文output与配置文件、interface文件里的output名称保持一样:
@Resource
private MessageChannel output;
... ....
// 函数内
ret = output.send(MessageBuilder.withPayload("cc-使用通道-MessageChannel模式发送消息".concat(msg)).build());
- 发送成功,在ng控制台查看:
订阅 同理 不过代码有不同
代码
- 配置
# 订阅
# 相当于topic
spring.cloud.stream.bindings.input.destination=zhangsan_msg
spring.cloud.stream.bindings.input.group=lisi-group-consumer_9527
spring.cloud.stream.bindings.ccWriteInput.destination=cc_msg
spring.cloud.stream.bindings.ccWriteInput.group=user-group-consumer_9528
- 通道类,【提示】CCInputOutput.java可以写多个output、input,注意名称对应即可:
public interface CCInputOutput {
String OUTPUT_CC_WRITE = "ccWriteOutput";
@Output(OUTPUT_CC_WRITE)
MessageChannel ccWriteOutput();
String INPUT_CC_WRITE = "ccWriteInput";
@Input(INPUT_CC_WRITE)
SubscribableChannel ccWriteInput();
}
- 生产和消费代码
生产
@Resource
MessageChannel ccWriteOutput;
... ...
User u1 = new User();
u1.setIdNumber("123789");
u1.setFullName("罗士信");
u1.setAddress("河西走廊");
boolean ret = ccWriteOutput.send(MessageBuilder.withPayload(u1).build());
消费
// 上文的INPUT_CC_WRITE
@StreamListener(CCInputOutput.INPUT_CC_WRITE)
public void receive(String messageBody){
log.debug("通过stream收到消息,messageBody:{}", messageBody);
// 处理messageBody 略
... ...
- 成功收到消息: