1. 部署rocketmq服务(windows)
windows部署需要配置环境变量配置环境变量
ROCKETMQ_HOME=D:\rocketMq\rocketmq-all-*-bin-release[配置自己的不要复制]
path增加%ROCKETMQ_HOME%\bin
1.1 部署nameser
执行bin目录下的mqnamesrv.cmd;
成功后能看见“The Name Server boot success..”字样
1.2 部署borker
在bin目录下cmd;
##必须要加-n 127.0.0.1:9876(nameser的服务ip端口)不然消息发送失败
start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true
成功后能看见“boot success. serializeType=JSON and name server is 127.0.0.1:9876”字样
2. 使用说明
2.1 @RocketMQMessageListener:创建一个消费者
- topic属性:设置消费者消费的消息主题
可以多个消费者设置同一个消息主题、每个消费者都能拿到消息 - consumerGroup属性:设置消费者的分组
可以多个消费者设置同一个分组,但是同一个分组只能有一个消费者拿到消息 - selectorExpression属性
默认为*表示可以接受所有消息,可以设置多个订阅关系中间用,隔开。设置订阅关系后只能拿到对应生成者发的消息
2.2 RocketMQTemplate.convertAndSend:发送消息
- destination参数:消息发送目标
消息主题或者消息主题+订阅关系【中间用:隔开】 - payload参数:具体消息内容
3. springboot 集成
- pom.xml文件配置
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
- yml配置文件
rocketmq:
name-server: 127.0.0.1:9876
producer:
# 是区分不同生产者发送消息的分组,确保生产者消息的负载均衡和高可用性
group: demo-producer-group
consumer:
# 用于区分不同的消费者消费者实例,确保同一个消费者组内的消费任务不会重复
group: demo-consumer-group
4. 代码示例
只有绑定订阅关系(my-tag)的才能接收到消息
//发送消息
@RestController
public class ProcucerController {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@RequestMapping("/producer")
public String producer(){
rocketMQTemplate.convertAndSend("atopic:my-tag", "hello-spring boot-rocketmq");
System.out.println("消息发送完毕");
return "消息发送完毕";
}
}
//消费者1
@Component
@RocketMQMessageListener(topic = "atopic",consumerGroup = "test",selectorExpression ="my-tag")
public class MqCustmoer1 implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
System.out.println("消费者1消费消息成功:"+s);
}
}
//消费者2
@Component
@RocketMQMessageListener(topic = "atopic",consumerGroup = "test")
public class MqCustmoer2 implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
System.out.println("消费者2消费消息成功:"+s);
}
}
同一个消费者组只有一个消费者能收到消息
//发送消息
@RestController
public class ProcucerController {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@RequestMapping("/producer")
public String producer(){
rocketMQTemplate.convertAndSend("atopic", "hello-spring boot-rocketmq");
System.out.println("消息发送完毕");
return "消息发送完毕";
}
}
//消费者1
@Component
@RocketMQMessageListener(topic = "atopic",consumerGroup = "test")
public class MqCustmoer1 implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
System.out.println("消费者1消费消息成功:"+s);
}
}
//消费者2
@Component
@RocketMQMessageListener(topic = "atopic",consumerGroup = "test")
public class MqCustmoer2 implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
System.out.println("消费者2消费消息成功:"+s);
}
}
不同消费者组都能收到消息
//发送消息
@RestController
public class ProcucerController {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@RequestMapping("/producer")
public String producer(){
rocketMQTemplate.convertAndSend("atopic", "hello-spring boot-rocketmq");
System.out.println("消息发送完毕");
return "消息发送完毕";
}
}
//消费者1
@Component
@RocketMQMessageListener(topic = "atopic",consumerGroup = "test1")
public class MqCustmoer1 implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
System.out.println("消费者1消费消息成功:"+s);
}
}
//消费者2
@Component
@RocketMQMessageListener(topic = "atopic",consumerGroup = "test2")
public class MqCustmoer2 implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
System.out.println("消费者2消费消息成功:"+s);
}
}