RocketMQ

一. JMS介绍

JMS(Java Message Service),是Java平台中关于面向消息中间件的接口,是一种与厂商无关的API,用来访问消息收发。它的使用场景如下:

  • 实现业务的解耦、削峰,异步。
  • 跨平台,多语言
  • 分布式事务,最终一致性

二. RocketMQ常见的概念

Producer:生产消息的服务。

Producer Group:

Consumer:

Consumber Group:

Topic:

Tag:

Message:

Broker:

Name Server:

Offset:

Commit log:

三. RocketMQ的使用

RocketMQ的下载地址:http://rocketmq.apache.org/release_notes/release-notes-4.4.0/

3.1 启动

rocketmq是用纯粹的Java语言编写,所以首先需要安装Jdk.

  • windows系统下启动:先启动mqnamesrv.cmd, 然后再启动mqbroker.cmd -n localhost:9876
  • Linux操作系统下启动:先启动mqnamesrv.sh, 然后再启动mqbroker.sh -n localhost:9876
3.2 验证

windows环境下:

set NAMESRV_ADDR=localhost:9876
tools.cmd org.apache.rocketmq.example.quickstart.Producer
set NAMESRV_ADDR=localhost:9876
tools.cmd  org.apache.rocketmq.example.quickstart.Consumer

Linux环境下:

export NAMESRV_ADDR=localhost:9876
bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
export NAMESRV_ADDR=localhost:9876
bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
3.3 rocketmq可视化控制台安装

下载地址:https://github.com/apache/rocketmq-externals

进入到 rocketmq-console 文件夹下,执行如下命令:

mvn clean package -Dmaven.test.skip=true
java -jar target/rocketmq-console-ng-1.0.1.jar

在浏览器输入:http://localhost:8080进行访问。

四. RocketMQ整合Spring boot

4.1 依赖
<dependency>
      <groupId>org.apache.rocketmq</groupId>
      <artifactId>rocketmq-client</artifactId>
      <version>4.4.0</version>
</dependency>
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
</dependency>
4.2 配置

新建一个mq.properties文件,文件的内容如下:

主要就是将基本参数放在了配置文件中,直接在类中调用使用

nameServerAdr=localhost:9876
producerGroupName=producer-test

sendMailTopic=email-send-topic
sendMailTopic.tag=registerSuccess
consumerGroup=consumer-group
4.3 生产者类的编写
// 消息生产者
@Configuration
@PropertySource("classpath:mq.properties")  //制定properties文件的位置
public class RocketProducer {

    @Value("${nameServerAdr}")
    private String nameServerAddress;  // name-server的地址

    @Value("${producerGroupName}")
    private String producerGroup;  //生产者组名

    @Value("${sendMailTopic}")
    private String topic;

    @Value("${sendMailTopic.tag}")
    private String tag;


    @Bean
    public DefaultMQProducer defaultMqProducer() {

        // 实例消息的生产者,然后通过构造方法制定其组
        DefaultMQProducer defaultMQProducer = new DefaultMQProducer(this.producerGroup);

        //设置nameServer的地址
        defaultMQProducer.setNamesrvAddr(this.nameServerAddress);

        try {


            defaultMQProducer.start();  //启动producer
        } catch (MQClientException e) {
            e.printStackTrace();
        }
        return defaultMQProducer;
    }
}

我们在Controller中调用创建消息

@RequestMapping("/test01")
    public Object test(){
        DefaultMQProducer defaultMQProducer = rocketProducer.defaultMqProducer();

        for (int i = 0; i < 100; i++) {

            //创建信息类
            Message msg = null;
            try {
                //参数 发送消息主题名,   消息标签, 信息
                msg = new Message("toipcTest",
                        "aaaa",
                        ("你好呀RocketMq " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));

                SendResult sendResult = defaultMQProducer.send(msg);

                System.out.printf("%s%n", sendResult);
            } catch (UnsupportedEncodingException e) {
                System.out.println(e.getMessage());
            } catch (InterruptedException | RemotingException | MQBrokerException | MQClientException e) {
                e.printStackTrace();
            }
        }

        return "ok";
    }
4.4 消费者类的编写
@Configuration
@PropertySource("classpath:mq.properties")
public class RocketConsumer {

    @Value("${nameServerAdr}")
    private String nameServerAddress;  // name-server的地址

    @Value("${producerGroupName}")
    private String producerGroup;  //生产者组名

    @Value("${sendMailTopic}")
    private String topic;

    @Value("${sendMailTopic.tag}")
    private String tag;

    @Bean
    public DefaultMQPushConsumer defaultMQPushConsumer() throws MQClientException {

        // 实例消息的生产者,然后通过构造方法制定其组
        DefaultMQPushConsumer defaultMqPushConsumer = new DefaultMQPushConsumer();

        defaultMqPushConsumer.setConsumerGroup(this.producerGroup);
        defaultMqPushConsumer.setNamesrvAddr(this.nameServerAddress);

        //设置nameServer的地址
        defaultMqPushConsumer.subscribe("toipcTest","aaaa");

        defaultMqPushConsumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
            System.out.println("开始接受消息==========================");

            msgs.forEach(mt -> {
                System.out.println(new String(mt.getBody()));
            });

            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });

        defaultMqPushConsumer.start();
        return defaultMqPushConsumer;
    }
结果

rockemq 如何将 topic 和 订阅组绑定_消息队列

消息成功接收到了