RocketMQ(一) 基本使用

RocketMQ

一. JMS介绍

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

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

二. RocketMQ常见的概念

Producer:生产消息的服务。

Producer Group: 消息生产者组,发送同类消息的一个消息生产组。

Consumer: 消费消息的服务。

Consumber Group: 消费同类消息的多个实例。

Topic: 主题,某类消息,queue是消息的物理管理单位,而topic是逻辑管理单位,一个topic下有多个queue,默 认4个。

Tag: 标签,子主题(二级分类),对Topic的进一步细化,用于区分同个主题下不同的业务消息。

Message: 消息,每个message必须指定一个topic

Broker: MQ程序,接收生产的消息,提供给消费者的程序。

Name Server: 给生产者和消费者提供路由信息,提供轻量级的服务发现、路由、元数据信息

Offset: 偏移量,可以理解为消息进度

Commit log: 消息存储会写在 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;
    }

结果

在这里插入图片描述

消息成功接收到了

发布了56 篇原创文章 · 获赞 3 · 访问量 4419

猜你喜欢

转载自blog.csdn.net/Tang_5253/article/details/102710654