一、rocket MQ安装(单机)

1.1、安装配置

下载地址

安装环境必须是64位。上传文件,并解压,更改解压后的文件名为rocketmq

unzip rocketmq-all-4.5.0-bin-release.zip
 mv rocketmq-all-4.5.0-bin-release rocketmq

conf配置文件说明

2m-25-async:2主2从异步
2m-2s-smc:2主2从同步
2m-nos1ave:2主没有从

rocketmq nameServer安装 rocketmq安装部署_apache

我们这里先配置单节点,可以修改2m-2s- async的配置实现。

进入2m-2s- async目录修改第1个配文件 broker-a.properties

将下面的配置覆盖掉broker-a.properties的所有配置

#所属集群名字
    brokerClusterName=rocketmq-cluster
    #broker名字,名字可重复,为了管理,每个master起一个名字,他的slave同他,eg:Amaster叫broker-a,他的slave也叫broker-a
    brokerName=broker-a
    #0 表示 Master,>0 表示 Slave
    brokerId=0
    #nameServer地址,分号分割
    namesrvAddr=192.168.209.36:9876
    #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    defaultTopicQueueNums=4
    #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    autoCreateTopicEnable=true
    #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=true
    #Broker 对外服务的监听端口,
    listenPort=10911
    #删除文件时间点,默认凌晨 4点
    deleteWhen=04
    #文件保留时间,默认 48 小时
    fileReservedTime=120
    #commitLog每个文件的大小默认1G
    mapedFileSizeCommitLog=1073741824
    #ConsumeQueue每个文件默认存30W条,根据业务情况调整
    mapedFileSizeConsumeQueue=300000
    #destroyMapedFileIntervalForcibly=120000
    #redeleteHangedFileInterval=120000
    #检测物理文件磁盘空间
    diskMaxUsedSpaceRatio=88
    #存储路径
    storePathRootDir=/usr/local/rocketmq/store/broker-a
    #commitLog 存储路径
    storePathCommitLog=/usr/local/rocketmq/store/broker-a/commitlog
    #消费队列存储路径存储路径
    storePathConsumeQueue=/usr/local/rocketmq/store/broker-a/consumequeue
    #消息索引存储路径
    storePathIndex=/usr/local/rocketmq/store/broker-a/index
    #checkpoint 文件存储路径
    storeCheckpoint=/usr/local/rocketmq/store/checkpoint
    #abort 文件存储路径
    abortFile=/usr/local/rocketmq/store/abort
    #限制的消息大小
    maxMessageSize=65536
    #flushCommitLogLeastPages=4
    #flushConsumeQueueLeastPages=2
    #flushCommitLogThoroughInterval=10000
    #flushConsumeQueueThoroughInterval=60000
    #Broker 的角色
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    brokerRole=ASYNC_MASTER
    #刷盘方式
    #- ASYNC_FLUSH 异步刷盘
    #- SYNC_FLUSH 同步刷盘
    flushDiskType=ASYNC_FLUSH
    #checkTransactionMessageEnable=false
    #发消息线程池数量
    #sendMessageThreadPoolNums=128
    #拉消息线程池数量
    #pullMessageThreadPoolNums=128

创建文件夹

mkdir -p /usr/local/rocketmq/store/broker-a 
/usr/local/rocketmq/store/broker-a/nsumequeue 
/usr/local/rocketmq/store/broker-a/commitlog 
/usr/local/rocketmq/store/broker-a/index 
/usr/local/rocketmq/logs 
/usr/local/rocketmq/store/broker-b-s 
/usr/local/rocketmq/store/broker-b-s/nsumequeue 
/usr/local/rocketmq/store/broker-b-s/commitlog 
/usr/local/rocketmq/store/broker-b-s/index

打开日志文件

rocketmq nameServer安装 rocketmq安装部署_apache_02

rocketmq nameServer安装 rocketmq安装部署_apache_03

更换日志命令

sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml

rocketmq nameServer安装 rocketmq安装部署_java_04

默认配置的内存较大,因为部署的是虚拟机,改小些

vim /usr/local/rocketmq/bin/runbroker.sh

rocketmq nameServer安装 rocketmq安装部署_java_05

vim /usr/local/rocketmq/bin/runserver.sh

rocketmq nameServer安装 rocketmq安装部署_apache_06

1.2、启动

先启动namesrv

nohup sh mqnamesrv &

rocketmq nameServer安装 rocketmq安装部署_apache_07

再启动broker

nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties &

-c 后面指定刚才的配置文件。

rocketmq nameServer安装 rocketmq安装部署_apache_08

1.3、利用web界面查看

下载地址

rocketmq nameServer安装 rocketmq安装部署_spring_09

修改配置文件,配置RocketMQ的服务器地址和端口,端口默认是9876,如果是集群一定使用**【分号】**隔开

rocketmq nameServer安装 rocketmq安装部署_java_10

rocketmq nameServer安装 rocketmq安装部署_java_11

使用maven打包

命令:

mvn clean package -Dmaven.test.skip=true

rocketmq nameServer安装 rocketmq安装部署_java_12

将jar运行起来,访问8080端口。

rocketmq nameServer安装 rocketmq安装部署_spring_13

rocketmq nameServer安装 rocketmq安装部署_spring_14

二、快速入门

2.1、RocketMQ消息消费者

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--引入rocketmq-->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>${rocketmq.version}</version>
        </dependency>
    </dependencies>
package com.tl.mq.quickstart;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.exception.RemotingException;

import java.io.UnsupportedEncodingException;

/**
 * @author gl
 * @create 2019-11-14 17:11
 */
public class Producer {
    public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
        //1、创建DefaultMQProducer
        DefaultMQProducer producer = new DefaultMQProducer("demo_producer_group") ;
        //2、设置 Namesrv地址
        producer.setNamesrvAddr("192.168.209.136:9876");
        //3、开启DefaultMQProducer 使用public Message(String topic, String tags, String keys, byte[] body) 构造函数
       producer.start();
        //4、创建消息Message
        //设置主题
        Message message = new Message("Topic_Demo",
                //主题
                "Tages",
                //消息唯一值
                "Keys_1",
                //内容
                "Hello".getBytes(RemotingHelper.DEFAULT_CHARSET)
        );
        //5、发送消息
        SendResult result = producer.send(message);
        System.out.println(result);
        //6、关闭DefaultMQProducer
        producer.shutdown();
    }
}

rocketmq nameServer安装 rocketmq安装部署_apache_15

2.2、RocketMQ消息消费者

package com.tl.mq.quickstart;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.common.RemotingHelper;

import java.io.UnsupportedEncodingException;
import java.util.List;

/***
 * 消息消费
 * @author GL
 */
public class Consumer {

    public static void main(String[] args) throws MQClientException {
        //1、创建DefaultMQPullConsumer
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("demo_producer_group");
        //2、设置 Namesrv地址
        consumer.setNamesrvAddr("192.168.240.133:9876");

        //设置消息拉去最大数
        consumer.setConsumeMessageBatchMaxSize(2);
        //3、设置subscribe,这里是读取的主题信息
        //参数一:消费主题
        //参数二:过滤规则
        consumer.subscribe("Topic_Demo","Tages");
        //创建消息监听MessageListener
        consumer.setMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                //迭代消息信息
                for (Message msg : msgs){
                    try {
                        //获取主题
                        String topic = msg.getTopic();
                        //获取标签
                        String tags = msg.getTags();

                        //获取信息
                        byte[] body = msg.getBody();
                        String result = new String(body, RemotingHelper.DEFAULT_CHARSET);

                        System.out.println("Consume消费信息——————topic:"+topic+",tages:"+tags+",result:"+result);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                        //消息消费失败,重试,它还会继续消费
                        return ConsumeConcurrentlyStatus.RECONSUME_LATER;
                    }
                }
                //消费成功
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        //开启Consumer
        consumer.start();
    }
}

控制台信息

Consume消费信息——————topic:Topic_Demo,tages:Tages,result:Hello

发现一个问题:消费启动之后不会自动停止

2.3、RocketMQ顺序消息

package com.tl.mq.order.quickstart;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.exception.RemotingException;

import java.io.UnsupportedEncodingException;
import java.util.List;

/**
 * 顺序消息生产者
 * 只需要将消息发送到一个队列里面就OK
 * @author gl
 * @create 2019-11-14 17:11
 */
public class OrderProducer {
    public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
        //1、创建DefaultMQProducer
        DefaultMQProducer producer = new DefaultMQProducer("demo_producer_order_group") ;
        //2、设置 Namesrv地址
        producer.setNamesrvAddr("192.168.240.133:9876");
        //3、开启DefaultMQProducer 使用public Message(String topic, String tags, String keys, byte[] body) 构造函数
       producer.start();
        //4、创建消息Message
        //设置主题
        Message message = new Message("Topic_order_Demo",
                //主题
                "Tages",
                //消息唯一值
                "Keys_1",
                //内容
                "Hello".getBytes(RemotingHelper.DEFAULT_CHARSET)
        );
        //5、发送消息
        //第一个参数:发送的消息信息
        //第二个参数:选中指定的消息队列对象(会将所有消息队列传入进来)
        //第三个参数:指定对应的队列下标
        //假设连续放松5条消息
       for (int i = 0 ;i< 5 ;i++){
           SendResult result = producer.send(
                   message,
                   new MessageQueueSelector() {
                       /**
                        *
                        * @param mqs 所有的消息队列,例如每一个RocketMQ有四个队列,有2个集群,那么就有8个消息队列。
                        * @param message
                        * @param arg 队列的下标
                        * @return
                        */
                       @Override
                       public MessageQueue select(List<MessageQueue> mqs, Message message, Object arg) {
                           //获取队列的下标
                           Integer index = (Integer) arg;
                           //获取对应下标的队列
                           return mqs.get(index);
                       }
                   },
                   1
           );
           System.out.println(result);
       }
        //6、关闭DefaultMQProducer
        producer.shutdown();
    }
}

控制条信息

rocketmq nameServer安装 rocketmq安装部署_java_16

2.4、RocketMQ顺序消费

package com.tl.mq.order.quickstart;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.*;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.common.RemotingHelper;

import java.io.UnsupportedEncodingException;
import java.util.List;

/***
 * 消息消费
 * @author GL
 */
public class OrderConsumer {

    public static void main(String[] args) throws MQClientException {
        //1、创建DefaultMQPullConsumer
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("demo_producer_order_group");
        //2、设置 Namesrv地址
        consumer.setNamesrvAddr("192.168.240.133:9876");

        //设置消息拉去最大数
        consumer.setConsumeMessageBatchMaxSize(2);
        //3、设置subscribe,这里是读取的主题信息
        //参数一:消费主题
        //参数二:过滤规则,可以写成主题
        consumer.subscribe("Topic_order_Demo",
                "*");
        //创建消息监听MessageListener
        consumer.setMessageListener(new MessageListenerOrderly() {
            @Override
            public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
                for (MessageExt msg : msgs){
                    try {
                        //获取主题
                        String topic = msg.getTopic();
                        //获取标签
                        String tags = msg.getTags();

                        //获取信息
                        byte[] body = msg.getBody();
                        String result = new String(body, RemotingHelper.DEFAULT_CHARSET);

                        System.out.println("Order————Consume消费信息——————topic:"+topic+",tages:"+tags+",result:"+result);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                        //消息消费失败,重试,它还会继续消费
                        return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;
                    }
                }
                //成功
                return ConsumeOrderlyStatus.SUCCESS;
            }
        });
        //开启Consumer
        consumer.start();
    }
}

控制台信息

Order————Consume消费信息——————topic:Topic_order_Demo,tages:Tages,result:Hello
Order————Consume消费信息——————topic:Topic_order_Demo,tages:Tages,result:Hello
Order————Consume消费信息——————topic:Topic_order_Demo,tages:Tages,result:Hello
Order————Consume消费信息——————topic:Topic_order_Demo,tages:Tages,result:Hello
Order————Consume消费信息——————topic:Topic_order_Demo,tages:Tages,result:Hello

2.5、RocketMQ事务消息

rocketmq nameServer安装 rocketmq安装部署_java_17