RocketMQ调研笔记

前面有个项目,客户要求使用RocketMQ,前面我们做了调研,使用了RocketMQ.Client这个库。
后面发现客户那边使用的是RocketMQ 4.9.7的版本,而RocketMQ.Client这个库应该是只支持最新的RocketMQ 5.X版本的。
所以需要重新适配。

目前是改用NewLife.RocketMQ。

前面同事反应,使用了NewLife.RocketMQ会有NLog日志无法输出的问题。我这会儿用测试代码试了一下,貌似又没有出现这个问题,貌似还是能正常输出的。
后面跟同事确认了一下,NLog不能正常输出的是RocketMQ.Client这个库。

安装RocketMQ 4.9.7

下载软件包,我是直接下载二进软件包。
到下面这个地址选择对应的版本进行下载即可:
https://dist.apache.org/repos/dist/release/rocketmq/

我下载的相当于是:
https://dist.apache.org/repos/dist/release/rocketmq/4.9.7/rocketmq-all-4.9.7-bin-release.zip

软件包解压缩到指定的目录。

安装Java

RocketMQ 4.X对JAVA版本有要求,太新的版本可能会执行失败,推荐版本是Java 8,我下载的是jdk-8u202-windows-x64.exe。

JAVA官方的网址下载很麻烦,需要注册登录。可以直接用华为的镜像站:
https://mirrors.huaweicloud.com/java/jdk/8u202-b08/

安装完成后需要设置一下系统环境变量:JAVA_HOME和ROCKETMQ_HOME,分别是JAVA的路径和RocketMQ的路径。
设置完成后需要注销一下或重启一下系统。
可以用java -version试一下是否安装成功。

C:\Users\wyc>java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

启动NameServer

打开控制台:

cd /d D:\rocketmq-all-4.9.7-bin-release\bin
mqnamesrv.cmd

启动Broker

打开控制台:

cd /d D:\rocketmq-all-4.9.7-bin-release\bin
mqbroker.cmd -n localhost:9876

生产者

using System;
using NewLife.RocketMQ;

namespace ProducerApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("RocketMQ 生产者演示");
            Console.WriteLine("连接到 NameServer: localhost:9876");
            Console.WriteLine("Topic: test_topic, Group: producer_group");
            Console.WriteLine();

            // 创建生产者实例
            var producer = new Producer
            {
                Topic = "test_topic",
                NameServerAddress = "localhost:9876",
                Group = "producer_group"
            };

            try
            {
                // 启动生产者
                producer.Start();
                Console.WriteLine("生产者已启动,开始发送消息...");

                // 发送10条测试消息
                for (int i = 1; i <= 10; i++)
                {
                    var message = $"测试消息 #{i} - 发送时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}";
                    
                    // 同步发送消息
                    var result = producer.Publish(message, "TestTag", $"Key_{i}");
                    
                    Console.WriteLine($"消息 {i}: {message}");
                    Console.WriteLine($"  发送状态: {result.Status}");
                    Console.WriteLine($"  消息ID: {result.MsgId}");
                    Console.WriteLine();
                    
                    System.Threading.Thread.Sleep(1000); // 每秒发送一条
                }

                Console.WriteLine("所有消息发送完成!");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"发送消息时发生错误: {ex.Message}");
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                // 停止生产者
                producer.Dispose();
                Console.WriteLine("生产者已停止。");
            }

            Console.WriteLine("按任意键退出...");
            try
            {
                Console.ReadKey();
            }
            catch (InvalidOperationException)
            {
                // 非交互式环境,自动退出
                Console.WriteLine("(非交互式环境,自动退出)");
            }
        }
    }
}

消费者

using System;
using NewLife.RocketMQ;

namespace ConsumerApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("RocketMQ 消费者演示");
            Console.WriteLine("连接到 NameServer: localhost:9876");
            Console.WriteLine("Topic: test_topic, Group: consumer_group");
            Console.WriteLine();

            // 创建消费者实例
            var consumer = new Consumer
            {
                Topic = "test_topic",
                Group = "consumer_group",
                NameServerAddress = "localhost:9876"
            };

            // 设置消费回调
            consumer.OnConsume = (queue, messages) =>
            {
                Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] 收到 {messages.Length} 条消息");
                Console.WriteLine($"  队列: {queue.BrokerName} - {queue.QueueId}");
                
                foreach (var msg in messages)
                {
                    Console.WriteLine($"  消息ID: {msg.MsgId}");
                    Console.WriteLine($"  内容: {msg.BodyString}");
                    Console.WriteLine($"  标签: {msg.Tags}");
                    Console.WriteLine($"  键: {msg.Keys}");
                    Console.WriteLine($"  生产时间: {msg.BornTimestamp:yyyy-MM-dd HH:mm:ss}");
                    Console.WriteLine();
                }
                
                return true; // 返回 true 表示消费成功
            };

            try
            {
                // 启动消费者
                consumer.Start();
                Console.WriteLine("消费者已启动,等待接收消息...");
                Console.WriteLine("按任意键停止消费者并退出。");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"消费消息时发生错误: {ex.Message}");
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                // 停止消费者
                consumer.Dispose();
                Console.WriteLine("消费者已停止。");
            }
        }
    }
}
posted @ 2026-07-01 11:00  wzwyc  阅读(5)  评论(0)    收藏  举报