rocketmq部署使用

347 阅读3分钟

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:创建一个消费者

  1. topic属性:设置消费者消费的消息主题
    可以多个消费者设置同一个消息主题、每个消费者都能拿到消息
  2. consumerGroup属性:设置消费者的分组
    可以多个消费者设置同一个分组,但是同一个分组只能有一个消费者拿到消息
  3. selectorExpression属性
    默认为*表示可以接受所有消息,可以设置多个订阅关系中间用,隔开。设置订阅关系后只能拿到对应生成者发的消息

2.2 RocketMQTemplate.convertAndSend:发送消息

  1. destination参数:消息发送目标
    消息主题或者消息主题+订阅关系【中间用:隔开】
  2. payload参数:具体消息内容

3. springboot 集成

  1. pom.xml文件配置
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.3.0</version>
</dependency>
  1. 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);
    }
}

官网

rocketmq.apache.org/