RocketMQ 调试环境搭建

1,058 阅读8分钟

启动NameServer

打开 org.apache.rocketmq.namesrv.NameServerInstanceTest 单元测试类,参考 #startup() 方法,我们编写 #main(String[] args) 静态方法,代码如下:

import org.apache.rocketmq.common.namesrv.NamesrvConfig;
import org.apache.rocketmq.remoting.netty.NettyServerConfig;

public class NameServerStart {

    public static void main(String[] args) throws Exception {
        // NamesrvConfig 配置
        final NamesrvConfig namesrvConfig = new NamesrvConfig();
        // NettyServerConfig 配置
        final NettyServerConfig nettyServerConfig = new NettyServerConfig();
        // 设置端口
        nettyServerConfig.setListenPort(9876); 
        // 创建 NamesrvController 对象,并启动
        NamesrvController namesrvController = new NamesrvController(namesrvConfig, nettyServerConfig);
        namesrvController.initialize();
        namesrvController.start();
        // 睡觉,就不起来
        Thread.sleep(DateUtils.MILLIS_PER_DAY);
    }
}

然后,右键运行,RocketMQ Namesrv 就启动完成。输出日志如下:

20:25:36.373 [NettyEventExecutor] INFO  RocketmqRemoting - NettyEventExecutor service started
20:25:36.373 [main] INFO  RocketmqCommon - Try to start service thread:FileWatchService started:false lastThread:null
20:25:36.374 [FileWatchService] INFO  RocketmqCommon - FileWatchService service started

最后,这是一个可选的步骤,命令行中输入 telnet 127.0.0.1 9876 ,看看是否能连接上 RocketMQ Namesrv 。

macs-MacBook-Pro-3:~ mac$ telnet 127.0.0.1 9876
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

启动 RocketMQ Broker

打开 org.apache.rocketmq.broker.BrokerControllerTest 单元测试类,参考 #testBrokerRestart() 方法,我们编写 #main(String[] args) 方法,代码如下:

import org.apache.commons.lang3.time.DateUtils;
import org.apache.rocketmq.common.BrokerConfig;
import org.apache.rocketmq.common.MQVersion;
import org.apache.rocketmq.remoting.netty.NettyClientConfig;
import org.apache.rocketmq.remoting.netty.NettyServerConfig;
import org.apache.rocketmq.remoting.protocol.RemotingCommand;
import org.apache.rocketmq.store.config.FlushDiskType;
import org.apache.rocketmq.store.config.MessageStoreConfig;

import static org.assertj.core.api.Assertions.assertThat;

public class BrokerStart {
    public static void main(String[] args) throws Exception {

        // 设置版本号
        System.setProperty(RemotingCommand.REMOTING_VERSION_KEY, Integer.toString(MQVersion.CURRENT_VERSION));
        // NettyServerConfig 配置
        final NettyServerConfig nettyServerConfig = new NettyServerConfig();
        nettyServerConfig.setListenPort(10911);
        // BrokerConfig 配置
        final BrokerConfig brokerConfig = new BrokerConfig();
        brokerConfig.setBrokerName("broker-a");
        brokerConfig.setNamesrvAddr("127.0.0.1:9876");
        // MessageStoreConfig 配置
        final MessageStoreConfig messageStoreConfig = new MessageStoreConfig();
        messageStoreConfig.setDeleteWhen("04");
        messageStoreConfig.setFileReservedTime(48);
        messageStoreConfig.setFlushDiskType(FlushDiskType.ASYNC_FLUSH);
        messageStoreConfig.setDuplicationEnable(false);

        BrokerController brokerController = new BrokerController(
                brokerConfig,
                nettyServerConfig,
                new NettyClientConfig(),
                messageStoreConfig
        );
        assertThat(brokerController.initialize());
        brokerController.start();
        // 睡觉,就不起来
        System.out.println("你猜");
        Thread.sleep(DateUtils.MILLIS_PER_DAY);
    }
}

然后,右键运行,RocketMQ Broker 就启动完成了。输出日志如下:

你猜

不要懵逼,我们打开下 RocketMQ Namesrv 那,已经输出日志如下

20:28:18.158 [RemotingExecutorThread_1] DEBUG RocketmqNamesrv - receive request, 103 127.0.0.1:52747 RemotingCommand [code=103, language=JAVA, version=333, opaque=0, flag(B)=0, remark=null, extFields={brokerId=0, bodyCrc32=28735049, clusterName=DefaultCluster, brokerAddr=192.168.60.33:10911, haServerAddr=192.168.60.33:10912, compressed=false, brokerName=broker-a}, serializeTypeCurrentRPC=JSON]
20:28:18.209 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new topic registered, RMQ_SYS_TRANS_HALF_TOPIC QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]
20:28:18.209 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new topic registered, %RETRY%please_rename_unique_group_name_4 QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]
20:28:18.209 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new topic registered, BenchmarkTest QueueData [brokerName=broker-a, readQueueNums=1024, writeQueueNums=1024, perm=6, topicSynFlag=0]
20:28:18.209 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new topic registered, OFFSET_MOVED_EVENT QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]
20:28:18.209 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new topic registered, macs-MacBook-Pro.local QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=7, topicSynFlag=0]
20:28:18.209 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new topic registered, TBW102 QueueData [brokerName=broker-a, readQueueNums=8, writeQueueNums=8, perm=7, topicSynFlag=0]
20:28:18.209 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new topic registered, SELF_TEST_TOPIC QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]
20:28:18.210 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new topic registered, DefaultCluster QueueData [brokerName=broker-a, readQueueNums=16, writeQueueNums=16, perm=7, topicSynFlag=0]
20:28:18.210 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new topic registered, DefaultCluster_REPLY_TOPIC QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]
20:28:18.210 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new topic registered, TopicTest QueueData [brokerName=broker-a, readQueueNums=4, writeQueueNums=4, perm=6, topicSynFlag=0]
20:28:18.210 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new topic registered, broker-a QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=7, topicSynFlag=0]
20:28:18.210 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new topic registered, %RETRY%TOOLS_CONSUMER QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]
20:28:18.211 [RemotingExecutorThread_1] INFO  RocketmqNamesrv - new broker registered, 192.168.60.33:10911 HAServer: 192.168.60.33:10912

最后,这是一个可选的步骤,命令行中输入 telnet 127.0.0.1 10911 ,看看是否能连接上 RocketMQ Broker 。

启动 RocketMQ Producer

打开 org.apache.rocketmq.example.quickstart.Producer 示例类,代码如下:

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;

/**
 * This class demonstrates how to send messages to brokers using provided {@link DefaultMQProducer}.
 */
public class Producer {
    public static void main(String[] args) throws MQClientException, InterruptedException {

        /*
         * Instantiate with a producer group name.
         */
        DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");

        /*
         * Specify name server addresses.
         * <p/>
         *
         * Alternatively, you may specify name server addresses via exporting environmental variable: NAMESRV_ADDR
         * <pre>
         * {@code
         * producer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");
         * }
         * </pre>
         */
        // <x> 哈哈哈哈
        producer.setNamesrvAddr("127.0.0.1:9876");

        /*
         * Launch the instance.
         */
        producer.start();

        for (int i = 0; i < 1000; i++) {
            try {

                /*
                 * Create a message instance, specifying topic, tag and message body.
                 */
                Message msg = new Message("TopicTest" /* Topic */,
                    "TagA" /* Tag */,
                    ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
                );

                /*
                 * Call send message to deliver message to one of brokers.
                 */
                SendResult sendResult = producer.send(msg);

                System.out.printf("%s%n", sendResult);
            } catch (Exception e) {
                e.printStackTrace();
                Thread.sleep(1000);
            }
        }

        /*
         * Shut down once the producer instance is not longer in use.
         */
        producer.shutdown();
    }
}

然后,右键运行,RocketMQ Producer 就启动完成。输出日志如下:

SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F48303DB, offsetMsgId=C0A83C2100002A9F00000000000AB747, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=3], queueOffset=846]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F48503DC, offsetMsgId=C0A83C2100002A9F00000000000AB82A, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=0], queueOffset=847]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F48703DD, offsetMsgId=C0A83C2100002A9F00000000000AB90D, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=1], queueOffset=847]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F48803DE, offsetMsgId=C0A83C2100002A9F00000000000AB9F0, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=2], queueOffset=847]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F48A03DF, offsetMsgId=C0A83C2100002A9F00000000000ABAD3, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=3], queueOffset=847]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F48B03E0, offsetMsgId=C0A83C2100002A9F00000000000ABBB6, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=0], queueOffset=848]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F48D03E1, offsetMsgId=C0A83C2100002A9F00000000000ABC99, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=1], queueOffset=848]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F48E03E2, offsetMsgId=C0A83C2100002A9F00000000000ABD7C, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=2], queueOffset=848]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F49003E3, offsetMsgId=C0A83C2100002A9F00000000000ABE5F, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=3], queueOffset=848]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F49203E4, offsetMsgId=C0A83C2100002A9F00000000000ABF42, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=0], queueOffset=849]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F49503E5, offsetMsgId=C0A83C2100002A9F00000000000AC025, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=1], queueOffset=849]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F49703E6, offsetMsgId=C0A83C2100002A9F00000000000AC108, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=2], queueOffset=849]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F49803E7, offsetMsgId=C0A83C2100002A9F00000000000AC1EB, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=3], queueOffset=849]
20:31:14.616 [NettyClientSelector_1] INFO  RocketmqRemoting - closeChannel: close the connection to remote address[127.0.0.1:9876] result: true
20:31:14.622 [NettyClientSelector_1] INFO  RocketmqRemoting - closeChannel: close the connection to remote address[192.168.60.33:10911] result: true

启动 RocketMQ Consumer

打开 org.apache.rocketmq.example.quickstart.Consumer 示例类,代码如下:

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

/**
 * This example shows how to subscribe and consume messages using providing {@link DefaultMQPushConsumer}.
 */
public class Consumer {

    public static void main(String[] args) throws InterruptedException, MQClientException {

        /*
         * Instantiate with specified consumer group name.
         */
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4");

        /*
         * Specify name server addresses.
         * <p/>
         *
         * Alternatively, you may specify name server addresses via exporting environmental variable: NAMESRV_ADDR
         * <pre>
         * {@code
         * consumer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");
         * }
         * </pre>
         */
        consumer.setNamesrvAddr("127.0.0.1:9876"); // <x> 哈哈哈哈

        /*
         * Specify where to start in case the specified consumer group is a brand new one.
         */
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

        /*
         * Subscribe one more more topics to consume.
         */
        consumer.subscribe("TopicTest", "*");

        /*
         *  Register callback to execute on arrival of messages fetched from brokers.
         */
        consumer.registerMessageListener(new MessageListenerConcurrently() {

            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                ConsumeConcurrentlyContext context) {
                System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });

        /*
         *  Launch the consumer instance.
         */
        consumer.start();

        System.out.printf("Consumer Started.%n");
    }
}

然后,右键运行,RocketMQ Consumer 就启动完成。输入日志如下:

ConsumeMessageThread_11 Receive New Messages: [MessageExt [queueId=1, storeSize=227, queueOffset=829, sysFlag=0, bornTimestamp=1575376274355, bornHost=/192.168.60.33:52799, storeTimestamp=1575376274356, storeHost=/192.168.60.33:10911, msgId=C0A83C2100002A9F00000000000A7935, commitLogOffset=686389, bodyCRC=157816852, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=850, CONSUME_START_TIME=1575376362962, UNIQ_KEY=FE800000000000007C285D2A69054BF6000014DAD5DC0EB3F3B30395, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 57, 49, 55], transactionId='null'}]]