RocketMQ5.0.0部署与实例

一、Idea调试

1.相关配置文件

在E:\rocketmq创建conf、logs、store三个文件夹。从RocketMQ distribution部署目录中将broker.conf、logback_namesrv.xml、logback_broker.xml文件复制到conf目录。如下图所示。

其中logback_namesrv.xml、logback_broker.xml分别是NameServer、Broker的日志配置文件,修改打印日志文件路径即可。broker.conf文件是Broker启动时的加载配置文件,如下代码所示。

注意:NameServer启动端口默认是9876,Broker启动端口默认10911。

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH

namesrvAddr=127.0.0.1:9876
brokerIP1=192.168.156.245

# 存储路径
storePathRootDir=E:\\rocketmq\\store
#commitLog 存储路径
storePathCommitLog=E:\\rocketmq\\store\\commitlog
# 消费队列存储路径
storePathConsumeQueue=E:\\rocketmq\\store\\consumequeue
# 消息索引|存储路径
storePathindex=E:\\rocketmq\\store\\index
#checkpoint 文件存储路径
storeCheckpoint=E:\\rocketmq\\store\\checkpoint
#abort 文件存储路径
abortFile=E:\\rocketmq\\store\\abort

2.启动NameServer

org.apache.rocketmq.namesrv.NamesrvStartup启动类配置环境变量ROCKETMQ_HOME,值是配置主目录“E:\rocketmq”,如下图所示。

出现“The Name Server boot success. serializeType=JSON”时,则NameServer启动成功。

3.启动Broker

org.apache.rocketmq.broker.BrokerStartup启动类配置环境变量ROCKETMQ_HOME,值是配置主目录“E:\rocketmq”;配置启动参数:-c E:\rocketmq\conf\broker.conf。如下图所示。

出现“The broker[broker-a, 192.168.156.245:10911] boot success. serializeType=JSON and name server is 127.0.0.1:9876”时,则Broker启动成功。

二、Linux部署

1.执行Maven命令

mvn -Prelease-all -DskipTests clean install -U

查看打包的可部署文件路径:.\distribution\target\rocketmq-5.0.0\rocketmq-5.0.0,如下图所示。

2.复制rocketmq-5.0.0

3.启动NameServer

nohup sh bin/mqnamesrv &

可能出现问题,如下图所示。原因是Windows系统下打包,换行符出现问题。解决:notepad++编辑器在Windows环境下将文本转换为Unix格式,步骤为:用Notepad++打开脚本 >> 编辑 >> 档案格式转换 >> 选择转换为UNIX格式。

4.启动Broker

nohup sh bin/mqbroker -n 192.168.1.55:9876 -c /home/rocketmq-5.0.0/conf/broker.conf &

启动命令中,-n是指定NameServer地址,-c 是broker的配置文件。

5.关闭NameServer、Broker命令

关闭NameServer:sh bin/mqshutdown namesrv

关闭Broker:sh bin/mqshutdown broker

三、事务消息实例

1.事务消息监听类

实现org.apache.rocketmq.client.producer.TransactionListener,该类有两个方法:

  • executeLocalTransaction():保存本地事务中间表,用于Broker回查事务状态

  • checkLocalTransaction():Broker定时回查事务状态,根据事务状态提交或回滚事务消息

package com.common.instance.demo.config.rocketmq;

import com.common.instance.demo.entity.TMessageTransaction;
import com.common.instance.demo.service.TMessageTransactionService;
import com.log.util.LogUtil;
import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * @description 订单事务消息监听器实现类
 * @author TCM
 * @version 1.0
 * @date 2023/1/1 16:44
 **/
@Component
public class OrderTransactionListenerImpl implements TransactionListener {

    @Resource
    private TMessageTransactionService tMessageTransactionService;

    @Override
    public LocalTransactionState executeLocalTransaction(Message message, Object arg) {
        // 组装事务
        TMessageTransaction tMessageTransaction = packageTMessageTransaction(message);

        // 保存事务中间表
        tMessageTransactionService.insert(tMessageTransaction);

        // 推荐返回UNKNOW状态,待事务状态回查
        return LocalTransactionState.UNKNOW;
    }

    @Override
    public LocalTransactionState checkLocalTransaction(MessageExt messageExt) {
        // 获取用户属性tabId
        String tabId = messageExt.getUserProperty("tabId");

        // 查询事务消息
        List<TMessageTransaction> tMessageTransactions = tMessageTransactionService.queryByTabId(tabId);

        if (!tMessageTransactions.isEmpty() && tMessageTransactions.size() <= 6) {
            return LocalTransactionState.COMMIT_MESSAGE;
        }

        LogUtil.error("orderTransaction rollBack, tabId: " + tabId);
        return LocalTransactionState.ROLLBACK_MESSAGE;
    }

    // 组装事务
    private TMessageTransaction packageTMessageTransaction(Message message) {
        TMessageTransaction tMessageTransaction = new TMessageTransaction();

        // 获取用户属性tabId
        String tabId = message.getUserProperty("tabId");
        // 事务ID
        String transactionId = message.getTransactionId();
        tMessageTransaction.setTabId(tabId);
        tMessageTransaction.setTransactionId(transactionId);
        tMessageTransaction.setCreateBy("auto");
        tMessageTransaction.setCreateTime(new Date());

        return tMessageTransaction;
    }

}

2. 事务消息生产者

package com.common.instance.demo.config.rocketmq;

import com.alibaba.fastjson.JSON;
import com.common.instance.demo.entity.WcPendantTab;
import com.log.util.LogUtil;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.TransactionMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;

/**
 * @description 订单事务消息生产者
 * @author TCM
 * @version 1.0
 * @date 2023/1/1 16:54
 **/
@Component
public class OrderTransactionProducer {

    @Resource
    private OrderProducerProperties orderProducerProperties;

    @Resource
    private OrderTransactionListenerImpl orderTransactionListener;

    private TransactionMQProducer orderTransactionMQProducer;

    @PostConstruct
    public void start() {
        try {
            LogUtil.info("start rocketmq: order transactionProducer");
            orderTransactionMQProducer = new TransactionMQProducer(orderProducerProperties.getProducerGroup());
            orderTransactionMQProducer.setNamesrvAddr(orderProducerProperties.getNameSrcAddr());
            orderTransactionMQProducer.setSendMsgTimeout(orderProducerProperties.getSendMsgTimeout());
            // 注册事务监听器
            orderTransactionMQProducer.setTransactionListener(orderTransactionListener);
            orderTransactionMQProducer.start();
        } catch (MQClientException e) {
            LogUtil.error("OrderTransactionProducer.start()", "start rocketmq failed!", e);
        }
    }

    public void sendTransactionMessage(WcPendantTab data) {
        sendTransactionMessage(data, orderProducerProperties.getTopic(), orderProducerProperties.getTag(), null);
    }

    public void sendTransactionMessage(WcPendantTab data, String topic, String tags, String keys) {
        try {
            // 消息内容
            byte[] msgBody = JSON.toJSONString(data).getBytes(StandardCharsets.UTF_8);
            // 消息对象
            Message message = new Message(topic, tags, keys, msgBody);
            message.putUserProperty("tabId", data.getTabId());

            // 发送事务消息
            orderTransactionMQProducer.sendMessageInTransaction(message, null);
        } catch (Exception e) {
            LogUtil.error("OrderTransactionProducer.sendMessage()","send order rocketmq error", e);
        }
    }

    @PreDestroy
    public void stop() {
        if (orderTransactionMQProducer != null) {
            orderTransactionMQProducer.shutdown();
        }
    }

}

3. 事务消息消费者

package com.common.instance.demo.config.rocketmq;

import com.log.util.LogUtil;
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.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * @description 订单消费者
 * @author TCM
 * @version 1.0
 * @date 2023/1/1 14:29
 **/
@Component
public class OrderConsumer implements MessageListenerConcurrently {

    @Resource
    private OrderConsumerProperties orderConsumerProperties;

    private DefaultMQPushConsumer orderMQConsumer;

    @PostConstruct
    public void start() {
        try {
            LogUtil.info("start rocketmq: order consumer");
            orderMQConsumer = new DefaultMQPushConsumer(orderConsumerProperties.getConsumerGroup());
            orderMQConsumer.setNamesrvAddr(orderConsumerProperties.getNameSrcAddr());
            orderMQConsumer.subscribe(orderConsumerProperties.getTopic(), orderConsumerProperties.getTag() == null ? "*":orderConsumerProperties.getTag());
            orderMQConsumer.setConsumeFromWhere(ConsumeFromWhere.valueOf(orderConsumerProperties.getConsumeFromWhere()));
            orderMQConsumer.registerMessageListener(this); // 注册监听器
            orderMQConsumer.start();
        } catch (MQClientException e) {
            LogUtil.error("OrderProducer.start()", "start rocketmq failed!", e);
        }
    }

    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
        int index = 0;
        try {
            for (; index < msgs.size(); index++) {
                // 完整消息
                MessageExt msg = msgs.get(index);
                // 消息内容
                String messageBody = new String(msg.getBody(), StandardCharsets.UTF_8);

                LogUtil.info("消费组消息内容:" + messageBody);
            }
        } catch (Exception e) {
            LogUtil.error("OrderConsumer.consumeMessage()", "consume order rocketmq error", e);
        } finally {
            if (index < msgs.size()) {
                // 消费应答
                context.setAckIndex(index + 1);
            }
        }
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }

    @PreDestroy
    public void stop() {
        if (orderMQConsumer != null) {
            orderMQConsumer.shutdown();
        }
    }

}

四、参考资料

https://www.cnblogs.com/qdhxhz/p/11094624.html

https://blog.csdn.net/xiqingchun/article/details/44571887

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要制作 RocketMQ 5.0.0 镜像,首先需要安装 Docker 并确保能够正常运行。然后按照以下步骤进行操作: 1. 下载 RocketMQ 5.0.0 的发布版本。可以在 Apache RocketMQ 的官方网站上下载到该版本的压缩包。 2. 解压缩下载的压缩包,在解压后的目录中找到 conf 目录,并进入该目录。 3. 在 conf 目录中,可以找到各个配置文件,如 broker.conf、namesrv.conf 等。根据实际需求,修改这些文件的配置,以便适应自己的环境。 4. 在解压后的目录中找到 bin 目录,并进入该目录。然后执行以下命令来启动 RocketMQ 的 Namesrv 和 Broker: ``` sh mqnamesrv sh mqbroker -n localhost:9876 ``` 5. 在命令行中,执行 ```docker ps``` 命令,查看当前正在运行的 Docker 容器。找到以 ```NAMESRV_ADDR=localhost:9876``` 和 ```BROKER_PORT=10911``` 为参数启动的容器。 6. 执行 ```docker commit <container_id> rocketmq:5.0.0``` 命令来将运行中的容器保存为一个新的镜像。其中,```<container_id>``` 是上一步中查询到的容器 ID。 7. 根据需要,可以设置其他的环境变量或将容器进行进一步的修改。 8. 最后,使用 ```docker save``` 命令将新制作的镜像保存到本地或上传到 Docker 镜像仓库中。 这样,就成功制作出了 RocketMQ 5.0.0 的镜像。接下来,可以根据实际需求使用该镜像来部署 RocketMQ 的集群或单机环境。 ### 回答2: 要制作RocketMQ 5.0.0镜像,可以按照以下步骤进行: 1. 下载RocketMQ 5.0.0的代码包,解压缩到一个目录中。 2. 进入解压缩后的代码目录,修改`pom.xml`文件,配置相关版本信息和依赖。 3. 使用Maven命令构建项目:`mvn clean package -Prelease-all`,等待构建完成。 4. 进入`distribution/target/rocketmq-5.0.0/rocketmq-5.0.0`目录,可以看到构建生成的文件。 5. 在该目录下创建一个名为`Dockerfile`的文件,用于构建镜像。可以使用文本编辑器打开该文件。 6. 在`Dockerfile`中,可以使用以下代码作为基础镜像,例如: ```bash FROM java:8-jre ``` 7. 接下来,添加一些必要的指令,例如复制构建生成的文件到镜像中: ```bash COPY target/rocketmq-5.0.0.tar.gz /opt/rocketmq.tar.gz ``` 8. 然后,解压缩RocketMQ的压缩包: ```bash WORKDIR /opt RUN tar -xzf rocketmq.tar.gz ``` 9. 进一步设置环境变量,例如: ```bash ENV ROCKETMQ_HOME /opt/rocketmq-5.0.0 ENV PATH $PATH:$ROCKETMQ_HOME/bin ``` 10. 最后,可以根据需要添加其他所需的指令,例如暴露端口、设置启动命令等。 11. 保存`Dockerfile`文件,并退出文本编辑器。 12. 在命令行中,切换到`Dockerfile`所在的目录,执行以下命令构建镜像: ```bash docker build -t rocketmq:5.0.0 . ``` 13. 等待镜像构建完成,即可使用该镜像来运行RocketMQ 5.0.0。 以上就是制作RocketMQ 5.0.0镜像的简要步骤,根据具体需求和环境可能会有所差异。 ### 回答3: 要制作RocketMQ 5.0.0镜像,可以按照以下步骤进行操作: 1. 首先,在一台已经安装了Docker的计算机上,下载RocketMQ 5.0.0的源代码包,并解压缩到一个指定的目录中。 2. 进入解压后的源代码目录,找到Dockerfile文件。Dockerfile是用来定义镜像构建过程的文本文件。 3. 打开Dockerfile文件,可以看到其中定义了一系列的指令,用来指导构建过程。例如,指定基础镜像、设置环境变量、安装依赖软件等。 4. 根据实际需求,可以修改Dockerfile文件中的指令。例如,可以修改基础镜像为某个特定版本的操作系统,可以添加额外的软件包等。 5. 完成修改后,可以使用Docker命令来构建镜像。在命令行中进入Dockerfile所在的目录,执行以下命令: ``` docker build -t rocketmq:5.0.0 . ``` 其中,rocketmq:5.0.0是你为镜像取的名字,最后的“.”表示Dockerfile所在的目录。 6. 执行上述命令后,Docker会根据Dockerfile的指令来构建镜像。这个过程可能会花费一些时间,取决于你的网络速度和计算机性能。 7. 构建完成后,可以使用以下命令来查看已经构建好的镜像列表: ``` docker images ``` 如果能看到rocketmq:5.0.0的镜像,表示构建成功。 8. 最后,可以使用以下命令来运行RocketMQ 5.0.0的容器: ``` docker run -it --name rocketmq-container rocketmq:5.0.0 ``` 这样就可以在Docker容器中运行RocketMQ 5.0.0了。 通过以上步骤,就可以制作并使用RocketMQ 5.0.0的镜像了。当然,在实际操作中还可能会有一些细节需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值