ROCKETMQ

RocketMq集群搭建 centos7+docker搭建rocketmq双主双从集群 阅读详情

1、RocketMQ安装

          下载地址:http://rocketmq.apache.org/dowloading/releases/

2、上传linux服务器并解压

2.1 启动rocketmq

2.1.1启动nameserver

a.启动nameserver

nohup sh /usr/soft/rocketmq-all-4.8.0-bin-release/bin/mqnamesrv &

 b.查看日志

tail -f ~/logs/rocketmqlogs/namesrv.log

2.1.2启动Broker

a.启动Broker

nohup sh /usr/soft/rocketmq-all-4.8.0-bin-release/bin/mqbroker -n localhost:9876 &

b.查看日志

tail -f ~/logs/rocketmqlogs/broker.log

2.2关闭rocketmq

2.2.1关闭nameserver

sh /usr/soft/rocketmq-all-4.8.0-bin-release/bin/mqshutdown namesrv

2.2.1关闭Broker

sh /usr/soft/rocketmq-all-4.8.0-bin-release/bin/mqshutdown broker

问题描述:
        RockerMQ默认的虚拟机内存较大,启动Broker如果因为内存不足失败,需要编辑如下两个文件,修改jvm内存大小
            vi runbroker.sh            
            JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
            vi runserver.sh

2.3 jps命令查看进程  是否启动关闭正常

3、rocketmq 集群

3.1集群分类

  • 多master
  • 多master多slave 同步
  • 多master多slave 异步

4、集群部署

4.1准备两套rocketmq环境

4.2配置host信息

vi /etc/host

#nameserver
192.168.0.102	rocketmq-nameserver1
192.168.0.103	rocketmq-nameserver2
#broker
192.168.0.102	rocketmq-master1
192.168.0.102	rocketmq-slave2
192.168.0.103	rocketmq-master2
192.168.0.103	rocketmq-slave1

4.3配置完成后重启网卡

systemctl restart network

4.4打开网络访问权限

4.4.1关闭防火墙

关闭防火墙
systemctl stop firewalld.service
查看防火墙状态
firewall-cmd --state
禁止firewalld开机启动
systemctl disable firewalld.service

4.4.2开发特定的端口

RocketMQ默认使用3个端口,9876、10911、11011

nameserver默认使用 9876

master默认使用 10911

slave默认使用 11011

执行以下命令
#开放name server端口
firewall-cmd --remove-port=9876/tcp --permanent
#开放master端口
firewall-cmd --remove-port=10911/tcp --permanent
#开放slave端口
firewall-cmd --remove-port=11011/tcp --permanent
#重启防火墙
firewall-cmd --reload

4.5配置环境变量信息

vi /etc/profile

在profile文件未追加如下信息

#set rocketmq
ROCKETMQ_HOME=/usr/soft/rocketmq-all-4.8.0-bin-release
PATH=$PATH:$ROCKETMQ_HOME/bin
export ROCKETMQ_HOME PATH
保存退出,并使得配置立即生效:
source /etc/profile

4.6配置消息存放路径

mkdir /usr/soft/rocketmq/store
mkdir /usr/soft/rocketmq/store/commitlog
mkdir /usr/soft/rocketmq/store/consumequeue
mkdir /usr/soft/rocketmq/store/index

4.7broker配置文件(双主双从 同步)

rocketmq-master1  主broker   broker-a.properties

brokerClusterName=rocketmq-cluster
brokerName=broker-a
#集群中 0 表示 Master,>0 表示 Slave
brokerId=0
brokerRole=SYNC_MASTER
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH

#指定broker的IP
#brokerIP1=192.168.8.113
#nameServer地址,集群用分号分割
namesrvAddr=rocketmq-master1:9876;rocketmq-master2: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/soft/rocketmq/store

#commitLog 存储路径
storePathCommitLog=/usr/soft/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/soft/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/soft/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/soft/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/soft/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000

#checkTransactionMessageEnable=false
#发消息线程池数量
sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessaeThreadPoolNums=128

#发送消息是否使用可重入锁
useReentrantLockWhenPutMessage=true
waitTimeMillsInSendQueue=300  #或者更大

rocketmq-master1  从broker   broker-b-s.properties

brokerClusterName=rocketmq-cluster
brokerName=broker-b
#集群中 0 表示 Master,>0 表示 Slave
brokerId=1
brokerRole=SLAVE
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH

#指定broker的IP
#brokerIP1=192.168.8.113
#nameServer地址,集群用分号分割
namesrvAddr=rocketmq-master1:9876;rocketmq-master2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/soft/rocketmq/store2
#commitLog 存储路径

storePathCommitLog=/usr/soft/rocketmq/store2/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/soft/rocketmq/store2/consumequeue
#消息索引存储路径
storePathIndex=/usr/soft/rocketmq/store2/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/soft/rocketmq/store2/checkpoint
#abort 文件存储路径
abortFile=/usr/soft/rocketmq/store2/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000

#checkTransactionMessageEnable=false
#发消息线程池数量
sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessaeThreadPoolNums=128

#发送消息是否使用可重入锁
useReentrantLockWhenPutMessage=true
waitTimeMillsInSendQueue=300  #或者更大

rocketmq-master2  主broker   broker-b.properties

brokerClusterName=rocketmq-cluster
brokerName=broker-b
#集群中 0 表示 Master,>0 表示 Slave
brokerId=0
brokerRole=SYNC_MASTER
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH

#指定broker的IP
#brokerIP1=192.168.8.113
#nameServer地址,集群用分号分割
namesrvAddr=rocketmq-master1:9876;rocketmq-master2: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/soft/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/soft/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/soft/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/soft/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/soft/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/soft/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000

#checkTransactionMessageEnable=false
#发消息线程池数量
sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessaeThreadPoolNums=128

#发送消息是否使用可重入锁
useReentrantLockWhenPutMessage=true
waitTimeMillsInSendQueue=300  #或者更大

rocketmq-master2  从broker   broker-a-s.properties

brokerClusterName=rocketmq-cluster
brokerName=broker-a
#集群中 0 表示 Master,>0 表示 Slave
brokerId=1
brokerRole=SLAVE
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH

#指定broker的IP
#brokerIP1=192.168.8.113
#nameServer地址,集群用分号分割
namesrvAddr=rocketmq-master1:9876;rocketmq-master2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/soft/rocketmq/store2
#commitLog 存储路径

storePathCommitLog=/usr/soft/rocketmq/store2/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/soft/rocketmq/store2/consumequeue
#消息索引存储路径
storePathIndex=/usr/soft/rocketmq/store2/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/soft/rocketmq/store2/checkpoint
#abort 文件存储路径
abortFile=/usr/soft/rocketmq/store2/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000

#checkTransactionMessageEnable=false
#发消息线程池数量
sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessaeThreadPoolNums=128

#发送消息是否使用可重入锁
useReentrantLockWhenPutMessage=true
waitTimeMillsInSendQueue=300  #或者更大

4.8 修改启动脚本文件

4.8.1 runbroker.sh

vi runbroker.sh            
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

4.8.2 runserver.sh

vi runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

4.9 服务启动

4.9.1 nameserver集群启动

两台集群都启动如下命令

nohup sh /usr/soft/rocketmq-all-4.8.0-bin-release/bin/mqnamesrv &

4.9.2broker集群启动

rocketmq-master1上启动

master1

cd  /usr/soft/rocketmq-all-4.8.0-bin-release/bin/
nohup sh mqbroker -c /usr/soft/rocketmq-all-4.8.0-bin-release/conf/2m-2s-sync/broker-a.properties &

salve2

cd  /usr/soft/rocketmq-all-4.8.0-bin-release/bin/
nohup sh mqbroker -c /usr/soft/rocketmq-all-4.8.0-bin-release/conf/2m-2s-sync/broker-b-s.properties &

rocketmq-master2

master2

cd  /usr/soft/rocketmq-all-4.8.0-bin-release/bin/
nohup sh mqbroker -c /usr/soft/rocketmq-all-4.8.0-bin-release/conf/2m-2s-sync/broker-b.properties &

salve1

cd  /usr/soft/rocketmq-all-4.8.0-bin-release/bin/
nohup sh mqbroker -c /usr/soft/rocketmq-all-4.8.0-bin-release/conf/2m-2s-sync/broker-a-s.properties &

5.mqadmin 命令

参考:https://www.iteye.com/blog/jameswxx-2091971

6.rocketmq监控配置

6.1 到https://github.com/  查找 rocketmq-externals  开源项目,clone到本地

6.2 找到 rocketmq-console 工程并修改其配置文件  application.properties

修改其中: rocketmq.config.namesrvAddr=你的rokcketmq机器1ip:9876;rokcketmq机器2ip:9876;

 6.3 在项目pom.xml  文件所在目录下运行一下命令打包工程

mvn clean package -Dmaven.test.skip=true

打包后的jar文件在 \target目录下

 将此jar文件上传至 rocketmq服务器上

运行 nohup java -jar rocketmq-console-ng-2.0.0.jar 启动服务

6.4 打开监控页面

http://ip:8080

7. rocketmq消息发送和接收

7.1 创建demo工程,并导入依赖

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.8.0</version>
</dependency>

7.2 消息发送和接收步骤

7.2.1消息发送者

  1. 创建生产者producer,并制定生产者组名
  2. 指定nameServer地址
  3. 启动producer
  4. 创建消息对象,指定Topic、Tag和消息体
  5. 发送消息
  6. 关闭生产者

7.2.2消息消费者

  1. 创建消费者consumer,并制定消费者组名
  2. 指定nameServer地址
  3. 订阅Topic、Tag
  4. 设置回调函数,处理消息
  5. 启动消费者consumer

7.3同步消息发送

package com.learn.mq.rocketmq.base.producer;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;

import java.nio.charset.StandardCharsets;
import java.security.ProtectionDomain;
import java.util.concurrent.TimeUnit;

public class SyncProducer {
    public static void main(String[] args) throws Exception {
        //1.创建生产者producer,并制定生产者组名
        DefaultMQProducer producer=new DefaultMQProducer("sync-producer-01");
        //2.指定nameServer地址
        producer.setNamesrvAddr("192.168.0.102:9876;192.168.0.103:9876");
        //3.启动producer
        producer.start();
        for (int i = 0; i < 10; i++) {
            //4.创建消息对象,指定Topic、Tag和消息体
            /**
             * arg1:消息主题 Topic
             * arg2:消息Tag
             * arg3:消息内容
             */
            Message msg=new Message("base","baseTag-sync",("Hello rocketmq"+i).getBytes(StandardCharsets.UTF_8));
            //5.发送消息
            SendResult result = producer.send(msg);
            System.out.println("消息发送结果:"+result);
            //线程休眠一秒
            TimeUnit.SECONDS.sleep(1);
        }
        //6.关闭生产者
        producer.shutdown();
    }
}

7.4异步消息发送

package com.learn.mq.rocketmq.base.producer;

import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;

import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;

public class AsyncProducer {
    public static void main(String[] args) throws Exception {
        //1.创建生产者producer,并制定生产者组名
        DefaultMQProducer producer=new DefaultMQProducer("Async-producer-01");
        //2.指定nameServer地址
        producer.setNamesrvAddr("192.168.0.102:9876;192.168.0.103:9876");
        //3.启动producer
        producer.start();
        for (int i = 0; i < 20; i++) {
            //4.创建消息对象,指定Topic、Tag和消息体
            /**
             * arg1:消息主题 Topic
             * arg2:消息Tag
             * arg3:消息内容
             */
            Message message=new Message("base","baseTag-async",("Hi Async-rocketmq"+i).getBytes(StandardCharsets.UTF_8));
            //5.发送异步消息
            producer.send(message, new SendCallback() {
                /**
                 * 发送成功回调函数
                 * @param sendResult
                 */
                @Override
                public void onSuccess(SendResult sendResult) {
                    System.out.println("发送结果"+sendResult);
                }

                /**
                 * 发送失败回调函数
                 * @param throwable
                 */
                @Override
                public void onException(Throwable throwable) {
                    System.out.println("发送异常返回"+throwable);
                }
            });
            //线程休眠一秒
            TimeUnit.SECONDS.sleep(1);
        }
    }
}

7.5 单向消息发送

package com.learn.mq.rocketmq.base.producer;

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.exception.RemotingException;

import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;

public class OneWayProducer {
    public static void main(String[] args) throws Exception {
        //1.创建生产者producer,并制定生产者组名
        DefaultMQProducer producer=new DefaultMQProducer("oneway-producer-01");
        //2.指定nameServer地址
        producer.setNamesrvAddr("192.168.0.102:9876;192.168.0.103:9876");
        //3.启动producer
        producer.start();
        for (int i = 0; i < 20; i++) {
            //4.创建消息对象,指定Topic、Tag和消息体
            /**
             * arg1:消息主题 Topic
             * arg2:消息Tag
             * arg3:消息内容
             */
            Message msg=new Message("base","baseTag-oneWay",("Hello 单项发送 rocketmq"+i).getBytes(StandardCharsets.UTF_8));
            //5.发送消息
            producer.sendOneway(msg);
            //线程休眠一秒
            TimeUnit.SECONDS.sleep(1);
        }
        //6.关闭生产者
        producer.shutdown();
    }
}

7.6消费者消费消息

package com.learn.mq.rocketmq.base.consumer;

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.common.message.MessageExt;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;

import java.util.List;

public class Consumer {
    public static void main(String[] args) throws Exception {
        //1.创建消费者consumer,并制定消费者组名
        DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("group1");
        //2.指定nameServer地址
        consumer.setNamesrvAddr("192.168.0.102:9876;192.168.0.103:9876");
        //3.订阅Topic、Tag
        consumer.subscribe("base","baseTag-sync");
        //设置消息模式:负载均衡 CLUSTERING / 广播模式 BROADCASTING
        consumer.setMessageModel(MessageModel.BROADCASTING);
        //4.设置回调函数,处理消息
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            //接收消息内容
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                for (MessageExt msg:list) {
                    byte[] body = msg.getBody();
                    System.out.println(new String(body));
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        //5.启动消费者consumer
        consumer.start();
    }
}

7.6.1 设置消费模式 负载均衡 /广播模式

//设置消息模式:负载均衡 CLUSTERING / 广播模式 BROADCASTING
        consumer.setMessageModel(MessageModel.BROADCASTING);

7.7 消息发送保证顺序消费

7.7.1 构造消息集合

package com.learn.mq.rocketmq.order;

import java.util.ArrayList;
import java.util.List;

/**
 * 订单构造者
 */
public class OrderStep {
    private long orderId;
    private String orderDesc;

    public long getOrderId() {
        return orderId;
    }

    public void setOrderId(long orderId) {
        this.orderId = orderId;
    }

    public String getOrderDesc() {
        return orderDesc;
    }

    public void setOrderDesc(String orderDesc) {
        this.orderDesc = orderDesc;
    }

    @Override
    public String toString() {
        return "OrderStep{" +
                "orderId=" + orderId +
                ", orderDesc='" + orderDesc + '\'' +
                '}';
    }
    public static List<OrderStep> buildOrders(){
        List<OrderStep> list=new ArrayList<>();
        OrderStep orderStep=new OrderStep();
        orderStep.setOrderId(20210112001l);
        orderStep.setOrderDesc("创建订单");
        list.add(orderStep);
        orderStep=new OrderStep();
        orderStep.setOrderId(20210112001l);
        orderStep.setOrderDesc("支付订单");
        list.add(orderStep);
        orderStep=new OrderStep();
        orderStep.setOrderId(20210112001l);
        orderStep.setOrderDesc("发送请求");
        list.add(orderStep);
        orderStep=new OrderStep();
        orderStep.setOrderId(20210112001l);
        orderStep.setOrderDesc("完成订单");
        list.add(orderStep);
        orderStep=new OrderStep();
        orderStep.setOrderId(20210112002l);
        orderStep.setOrderDesc("创建订单");
        list.add(orderStep);
        orderStep=new OrderStep();
        orderStep.setOrderId(20210112002l);
        orderStep.setOrderDesc("支付订单");
        list.add(orderStep);
        orderStep=new OrderStep();
        orderStep.setOrderId(20210112002l);
        orderStep.setOrderDesc("完成订单");
        list.add(orderStep);
        orderStep=new OrderStep();
        orderStep.setOrderId(20210112003l);
        orderStep.setOrderDesc("创建订单");
        list.add(orderStep);
        orderStep=new OrderStep();
        orderStep.setOrderId(20210112003l);
        orderStep.setOrderDesc("发送请求");
        list.add(orderStep);
        orderStep=new OrderStep();
        orderStep.setOrderId(20210112003l);
        orderStep.setOrderDesc("完成订单");
        list.add(orderStep);
        return list;
    }
}

7.7.3 发送消息 

package com.learn.mq.rocketmq.order;

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 java.nio.charset.StandardCharsets;
import java.util.List;

public class Producer {
    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer=new DefaultMQProducer("messageOrder");
        producer.setNamesrvAddr("192.168.0.102:9876;192.168.0.103:9876");
        producer.start();
        List<OrderStep> orderSteps=OrderStep.buildOrders();
        for(int i=0;i<orderSteps.size();i++){
            String order=orderSteps.get(i)+"";
            Message message=new Message("order","orderMessage","i:"+i,order.getBytes(StandardCharsets.UTF_8));
            /**
             * arg1 消息
             * arg2 消息队列的选择器
             * arg3 选择队列的业务标识
             */
            SendResult sendResult = producer.send(message, new MessageQueueSelector() {
                /**
                 *
                 * @param list 队列集合
                 * @param message   消息对象
                 * @param o 业务标识的参数
                 * @return
                 */
                @Override
                public MessageQueue select(List<MessageQueue> list, Message message, Object o) {
                    Long orderId = (Long) o;
                    long index = orderId % list.size();
                    return list.get((int) index);
                }
            }, orderSteps.get(i).getOrderId());
            System.out.println("消息发送结果:"+sendResult);
        }
    }
}

7.7.4 消费消息

package com.learn.mq.rocketmq.order;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.List;

public class Consumer {
    public static void main(String[] args) throws Exception {
        DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("orderConsumer");
        consumer.setNamesrvAddr("192.168.0.102:9876;192.168.0.103:9876");
        consumer.subscribe("order","orderMessage");
        consumer.registerMessageListener(new MessageListenerOrderly() {
            @Override
            public ConsumeOrderlyStatus consumeMessage(List<MessageExt> list, ConsumeOrderlyContext consumeOrderlyContext) {
                for (MessageExt msg:list){
                    System.out.println("用户"+Thread.currentThread().getName()+"处理消息:"+new String(msg.getBody()));
                }
                return ConsumeOrderlyStatus.SUCCESS;
            }
        });
        consumer.start();
    }
}

7.5设置延迟发送消息

//设置延迟发送消息
msg.setDelayTimeLevel(2);

7.6 消息批量发送

package com.learn.mq.rocketmq.batch;

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 java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class Producer {
    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer=new DefaultMQProducer("batch-producer");
        producer.setNamesrvAddr("192.168.0.102:9876;192.168.0.103:9876");
        producer.start();
        Message message1=new Message("batch-producer","batch","Hello btach1".getBytes(StandardCharsets.UTF_8));
        Message message2=new Message("batch-producer","batch","Hello btach2".getBytes(StandardCharsets.UTF_8));
        Message message3=new Message("batch-producer","batch","Hello btach3".getBytes(StandardCharsets.UTF_8));
        List<Message> list=new ArrayList<>();
        list.add(message1);
        list.add(message2);
        list.add(message3);
        SendResult sendResult = producer.send(list);
        System.out.println("发送结果:"+sendResult);
        producer.shutdown();
    }
}

注:消费发送的包不能大于 4MB

 8. 消息过滤

8.1Tag形式过滤

consumer.subscribe("filter-tag","filter5 || filter6  || filter9");
或者
consumer.subscribe("filter-tag","*");

8.2 SQL方式过滤

【2023最新】Docker下安装RocketMQ-5.1.3教程【单机】 本教程属于单机部署,仅用于测试。 阅读详情

相关推荐

202529 | RocketMQ 简介 + 安装 + 集群搭建 + 消费模式 + 消费者组

特性Push模式Pull模式实现原理服务端长轮询客户端主动请求实时性高(毫秒级)依赖拉取频率资源消耗服务端连接开销大客户端控制开销大消费控制自动提交offset需手动管理offset适用场景常规实时业务特殊调度需求/批量处理消费者组是RocketMQ中逻辑上的订阅单元,由多个消费者实例组成,共同消费同一Topic下的消息。// 消费者组声明示例。

weixin_43422022的博客 1195

1-RocketMq

简介 基于java开发,高可用 应用场景 1、应用解耦 2、流量销峰 3、异步处理 4、消息分发(邮件、短信、日志、数据处理) 延时队列场景:需要延时单次延迟执行的场景,比如订单取消 常见问题 1、如何保证高可用 集群部署 2、如何保证消息不丢失(消息的可靠性传输) 生产者丢失数据 开启生产者确认模式,确认发送成功了才对消费者可见 消息队列丢失数据 开启消息持久化,设置好刷盘策略...

Link的博客 256

Springboot整合Rocketmq系列教程

本教程是基于Springboot2.6.3整合Rocketmq5.0,其中涉及了Rocketmq的安装,消息的发送及消费的代码实现。本文不会对rocketmq的一些概念、原理,及注意事项进行讲解,因为官网已经写的很清楚,又有中文版,详细访问https://rocketmq.apache.org/zh/docs/quickStart/01quickstart。

gzmyh的博客 9111

RocketMQ-手把手教你搭建集群

目录 一、集群架构 二、准备rocketmqOS1主机 三、修改rocketmqOS1配置文件 配置文件位置 修改broker-a.properties 修改broker-b-s.properties 其它配置 四、准备rocketmqOS2主机 五、修改rocketmqOS2配置文件 修改broker-b.properties 修改broker-a-s.properties 六、启动服务器 启动NameServer集群 启动两个Master 启动两个Slave 七、mqad

秃了也弱了 3521

RocketMQ

RocketMQ能够有效解决系统解耦、流量削峰、异步处理等问题,提高系统的可扩展性和稳定性。

weixin_51040479的博客 2091

Windows 下安装 RocketMQ

RocketMQ 安装内容一、 RocketMQ环境搭建1. 下载RocketMQ2. window的安装配置2.1 使用 rocketmq-4.5.1.zip 解压到指定目录2.2 需要配置环境变量 ROCKETMQ_HOME3. 修改broker的配置文件3.1 打开 broker.conf 文件3.2 添加配置4. 先启动 mqnamesrv5. 启动broker6. 启动管理控制台总结 内容 一、 RocketMQ环境搭建 1. 下载RocketMQ http://rocketmq.apac

zzvar的博客 9736

RocketMQ吐血总结

RocketMQ吐血总结 架构   概念模型 最基本的概念模型与扩展后段概念模型  存储模型   RocketMQ吐血总结 User Guide RocketMQ是一款分布式消息中间件,最初是由阿里巴巴消息中间件团队研发并大规模应用于生产系统,满足线上海量消息堆积的需求, 在2016年底捐赠给Apache开源基金会成为孵化项目,经过不到一年时间正式成为了A...

武汉红喜 15万+

rocketmq使用mqtt协议

rocketmq从4.9.3开始,可以兼容mqtt协议,需要安装编译一个rocketmq-mqtt工程,参考:https://rocketmq.apache.org/zh/docs/4.x/mqtt/02RocketMQMQTTQuickStart/需要安装rocketmq4.9.3以上的版本 安装过程略broker.conf配置文件中添加参数,开启多队列分发特性 二、打包rocketmq-mqtt 安装maven配置环境变量 过程略 下载并打包 三、配置rocketmq-mqtt 下面例子中 ROCKET

文若书生的专栏 8288

Windows下安装RocketMQ

这里并不打算深入讲解RocketMQ的架构和特性,因为我觉得,针对于初学者,太早地深入知识细节,会让人感到迷惘,学习起来吃力。namesrvAddrs地址就是服务的地址,192.168.10.100是我虚拟主机的ip,如果是window环境下,改成localhost。两个部分,因此,用作本机开发调试用的最小应用,应该分别启动一个NameServer和一个Broker节点。以上的知识都来源于RocketMQ官网的参考文档,需要更多细节的同学, 可以打开。为文件名后缀,linux环境的脚本以。

GSON的博客 1680

【COMSOL】修改内置物理场方程 模拟水沸腾的蒸汽泡运动

在COMSOL中通过弱贡献(weak contribution)节点,可以向任何内置模型方程中添加约束。这里,以模拟水沸腾的蒸汽泡运动为例,来讲一讲当我们研究的方程与模块方程不一样时,应该怎么增加新的贡献项。

u012161192的博客 9007

ESP32-BLE学习1-建立简单的server

start 学习之前,我想尝试使用ESP32的demo建立一个简单的server与手机接进行最基本的数据通信。 这里有BLE的简单讲解BLE资料 因为BLE的连接是具有主从机特性的,就像SPI,USB一些请求只能由主机端发起,连接也需要主机端发起。所以手机要想连上ESP32,就得将ESP32设置为从机模式。 从资料上可以看到,从机端通过Notify通知主机,所以从机就是GATT Server。 在进行ESP32 的demo学习之前,得大体看下ESP32的蓝牙组成,ESP32支持经典蓝牙和低功耗蓝牙4.2,

Spark的博客 1841

Rocketmq

由于Rocketmq使用java写的,所以运行环境需要jdk将文件上传到 /root 目录执行解压命令配置环境变量修改 /etc/profile 配置文件, 配置环境变量修改完后, 让环境变量立即生效验证。

asddasddeedd的博客 8111

Pixhawk固定翼飞行控制实战:L1与TECS算法详解(附代码解析)

本文深入解析了Pixhawk飞控在固定翼无人机中的核心控制算法:L1导航与TECS总能量控制。通过剖析算法原理、代码实现与实战调参,帮助开发者解决航线跟踪振荡、高度速度不稳定等常见问题,实现精准稳定的自主飞行。

wine的专栏 742

RocketMQ-初体验RocketMQ(08)-IDEA拉取调测RocketMQ源码

文章目录从Git上迁出源码修改源码,启动namersrv修改源码,启动broker 从Git上迁出源码 Github: https://github.com/apache/rocketmq/ clone ,等待… 完成后,如下 修改源码,启动namersrv 需要ROCKETMQ_HOME , 这里可以通过配置IDEA的方式,也可以通过修改源码直接setRocketmqHome,我们...

小工匠 2万+

OpenSSL玩转证书链:从Windows CA根证书到签发多域名/IP的服务器证书全攻略

本文详细介绍了如何使用OpenSSL在Windows环境下构建私有CA体系,从创建CA根证书到签发支持多域名/IP的服务器证书的全流程。通过实战指南,读者可以掌握零成本证书管理技术,灵活配置SAN扩展,并了解在Nginx、Apache等主流服务器中的证书部署方法,适用于企业内网、IoT设备等HTTPS加密场景。

weixin_28731223的博客 440

A类功率放大器

在A类放大器中,导通角是完整的360°或100%的输入信号,而在其他类别的放大器中,晶体管在一个较小的导通角内导通。通过在输出级使用两个互补的晶体管,其中一个晶体管是NPN或N通道类型,而另一个晶体管是PNP或P通道(互补)类型,以所谓的 "推挽 "配置连接,可以获得比A类放大器更大的功率输出和效率。这种类型的电路效率很低(低于30%),而且对直流电源的消耗很大,输出的功率却很小。由于我们感兴趣的是向负载提供最大的交流功率,同时从电源中消耗尽可能少的直流电,所以我们主要关注的是放大器的 "转换效率"。

LSW20072007的博客 2466

Spring Boot 集成 RocketMQ

RocketMQ 是一款由阿里巴巴开源的分布式消息中间件,最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型,具备高吞吐、低延迟、高可用和强一致性的特点,适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ 的原理和核心概念的详细介绍,帮助你快速认识和熟悉 RocketMQ。到官网 下载最新版本的 RocketMQ 二进制包(Binary 下载)。将下载的 ZIP 文件解压到您选择的目录,例如 D:\software\rocketmq-all-5.1.4-bin-release。

sunyanchun的专栏 5232

科研绘图系列:R语言绘制极坐标饼图(pie plot)

科研绘图系列:R语言极坐标饼图(pie plot)

专注生信领域 1052

【RocketMQ】windows安装

访问RocketMQ Dashboard的GitHub发行版页面:https://github.com/apache/rocketmq-dashboard/releases。变量值: JDK安装路径(如:C:\Program Files\Java\jdk-1.8)默认下一步,修改安装路径:D:\Program Files\Java\jdk-21。变量值:RocketMQ安装路径(如:C:\rocketmq)将下载的压缩包解压到指定目录,如:C:\rocketmq。

weixin_44823875的博客 1181

HiCMAE 论文复现:基于 RAVDESS 数据集的音视频情感识别

多模态情感识别是人工智能领域的重要研究方向,旨在通过结合多种感知模态(如音频、视频、文本等)来更准确地识别人类情感状态。与传统单模态方法相比,多模态方法能够利用不同模态间的互补信息,提高情感识别的鲁棒性和准确性。 RAVDESS(Ryerson Audio-Visual Database of Emotional Speech and Song)是一个常用的多模态情感识别数据集,包含24位专业演员(12名男性,12名女性)表达的8种情感状态(中性、平静、快乐、悲伤、愤怒、恐惧、厌恶和惊讶)的音视频数据。

max500600的博客 497

(一)激光线扫描-三维成像原理

激光线扫描是一种使用激光作为光源,通过特定的扫描设备(如光学镜头、电机驱动的镜头或电子扫描设备)将激光束引导到目标表面,并按照预定的路径进行扫描的技术。这种技术通常用于测量、检测、打印、切割等多种应用中。

FlyWine的博客 3629

【RocketMq 系列】springboot RocketMq 入门教程

Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨,RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案,被广泛应用于互联网、大数据、移动互联网、物联网等领域的业务场景。

做一个有思想的技术人 2505

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

RocketMQ的安装

RocketMQ安装与使用指南:从入门到核心概念 摘要:本文详细介绍了RocketMQ的安装配置、存储结构、可视化插件部署以及核心功能实现。内容涵盖NameServer和Broker的启动配置,消息存储机制(Commitlog、Consumerqueue等),并解答了磁盘存储不影响性能的关键技术(mmap零拷贝)。通过案例演示了同步/异步消息发送、顺序消息处理、延迟消息(支持18个预设等级)和分布式事务消息的实现原理。重点解析了RocketMQ四大核心组件(Producer/Consumer/Broker/

2301_77320332的博客 2458

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[RocketMQ][Docker]Docker构建部署RocketMQ:4.9.2

[RocketMQ][Docker]Docker构建部署RocketMQ:4.9.2

凉月的博客 3016

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

学习使用RocketMQ

官方说明:随着使用越来越多的队列和虚拟主题,ActiveMQ IO模块遇到了瓶颈。我们尽力通过节流,断路器或降级来解决此问题,但效果不佳。因此,我们那时开始关注流行的消息传递解决方案Kafka。不幸的是,Kafka不能满足我们的要求,特别是在低延迟和高可靠性方面。看到这里可以很清楚的知道RcoketMQ 是一款低延迟、高可靠、可伸缩、易于使用的消息中间件。

andy7_的博客 2059
上一篇: Git使用
下一篇: Docker笔记
Create_zy
博客等级 码龄10年 2粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值