一、引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
二、创建producer模块
关键配置文件,使用cloud框架,还需要配置注册中心等配置,这里不作展示,文末我会上传代码
--- # rocketmq 配置
spring:
cloud:
stream:
rocketmq:
binder:
# rocketmq 地址
name-server: 192.168.48.13:9876,192.168.48.13:9877
bindings:
demo-out-0:
producer:
# 必须得写
group: test-group
# 开启延迟发送
sync: true
bindings:
demo-out-0:
content-type: application/json
destination: stream-test-topic
group: test-group
binder: rocketmq
producer类,发送的地址的配置,注意跟配置文件保持一致即可。
import com.geovis.domain.MQMessage;
import org.apache.rocketmq.common.message.MessageConst;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
import java.util.UUID;
@Component
public class RMQStreamProducer {
@Autowired
private StreamBridge streamBridge;
public void sendMsg(String msg) {
// 构建消息对象
MQMessage mqMessage = new MQMessage().setMsgId(UUID.randomUUID().toString()).setMsgText(msg);
streamBridge.send("demo-out-0", MessageBuilder.withPayload(mqMessage).build());
}
/**
* 发送延迟消息
* @param msg
*/
public void sendDelayMsg(String msg) {
// 构建消息对象
MQMessage mqMessage = new MQMessage().setMsgId(UUID.randomUUID().toString()).setMsgText(msg);
Message<MQMessage> message = MessageBuilder.withPayload(mqMessage).setHeader(MessageConst.PROPERTY_DELAY_TIME_LEVEL,4).build();
streamBridge.send("demo-out-0", message);
}
}
注意:RocketMQ延时消息的延迟时长不支持随意时长的延迟,是通过特定的延迟等级来指定的。
默认支持18个等级的延迟消息,延时等级定义在RocketMQ服务端的MessageStoreConfig类中的如下变量中:
// MessageStoreConfig.java
private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h";
//发消息时,设置delayLevel等级即可:msg.setDelayLevel(level)。level有以下三种情况:
level == 0,消息为非延迟消息
1<=level<=maxLevel,消息延迟特定时间,例如level==1,延迟1s
level > maxLevel,则level== maxLevel,例如level==20,延迟2h
例如指定的延时等级为3,则表示延迟时长为10s,即延迟等级是从1开始计数的。
控制类
import com.geovis.producer.RMQStreamProducer;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 测试mq
*/
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/rmq")
public class MqController {
private final RMQStreamProducer rmqStreamProducer;
/**
* 发送消息Rocketmq
*
* @param msg 消息内容
*/
@GetMapping("/sendMsg")
public ModelMap sendMsg(String msg) {
rmqStreamProducer.sendMsg(msg);
ModelMap modelMap = new ModelMap();
modelMap.addAttribute("code","0");
modelMap.addAttribute("msg","OK");
return modelMap;
}
/**
* 发送消息Rocketmq
*
* @param msg 消息内容
*/
@GetMapping("/sendDelayMsg")
public ModelMap sendDelayMsg(String msg) {
rmqStreamProducer.sendDelayMsg(msg);
ModelMap modelMap = new ModelMap();
modelMap.addAttribute("code","0");
modelMap.addAttribute("msg","OK");
return modelMap;
}
使用postman工具测试
通过界面可以查看自己发送的数据信息
三、创建consumer模块
配置文件,还是只列出核心的配置
spring:
cloud:
stream:
function:
# 重点配置 与 binding 名与消费者对应
definition: demo
--- # rocketmq 配置
spring:
cloud:
stream:
rocketmq:
binder:
# rocketmq 地址
name-server: 192.168.48.13:9876,192.168.48.13:9877
bindings:
demo-in-0:
consumer:
# 必须得写
group: test-group
bindings:
demo-in-0:
content-type: application/json
destination: stream-test-topic
group: test-group
binder: rocketmq
消费者类
import com.geovis.domain.MQMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import java.util.function.Consumer;
@Slf4j
@Component
public class RMQStreamConsumer {
@Bean
Consumer<MQMessage> demo() {
log.info("初始化订阅");
return msg -> {
log.info("通过stream消费到消息 => {}", msg.getMsgText());
};
}
}
原 @Input @OutPut @EnableBinding 已过时,使用函数式编程即可。
写法参考配置文件中的样例,名称需要与方法名称一致。
spring:
cloud:
stream:
function:
# 重点配置 与 binding 名与消费者对应
definition: demo
消费的消息如下图
结尾附上测试源码 源码地址