RocketMQ的啓動及其使用完成生產消費模型(參考官網一下子就啓動起來了)

1)添加ROCKET_HOME環境變量

2)啓動namesrv

3)Broker啓動

注意: 如果jdk的目錄不能有空格!!! 比如在File Program下,則啓動報錯,需要換一下jdk的路徑。 重新配置JAVA_HOME

4)java端代碼

pom.xml

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

生產者

package org.example.test.mq;

import com.alibaba.fastjson.JSONObject;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 消息隊列: 生產者
 */
public final class MQProducer {
    static private final Logger LOGGER = LoggerFactory.getLogger(MQProducer.class);
    static private DefaultMQProducer _producer = null; // 生產者

    private MQProducer() {
    }

    static public void init() {
        try {
            // 創建生產者
            DefaultMQProducer producer = new DefaultMQProducer("herostory");

            // 指定 nameServer 地址
            producer.setNamesrvAddr("localhost:9876");

            // 啓動生產者
            producer.start();
            producer.setRetryTimesWhenSendAsyncFailed(3);

            _producer = producer;
        } catch (Exception ex) {
            LOGGER.error(ex.getMessage(), ex);
        }
    }

    /**
     * 發送消息
     *
     * @param topic 主題
     * @param msg   消息對象
     */
    static public void sendMsg(String topic, Object msg) {
        if (null == topic ||
                null == msg) {
            return;
        }

        if (null == _producer) {
            throw new RuntimeException("_producer 尚未初始化");
        }

        Message mqMsg = new Message(); // TODO 這個是RocketMQ的類

        mqMsg.setTopic(topic); // 設置主題
        mqMsg.setBody(JSONObject.toJSONBytes(msg)); // 設置內容

        try {
            // 往消息隊列中添加消息
            _producer.send(mqMsg);
        } catch (Exception ex) {
            LOGGER.error(ex.getMessage(), ex);
        }
    }
}

消費者

package org.example.test.mq;

import com.alibaba.fastjson.JSONObject;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;


import java.util.List;

/**
 * 消息隊列: 消費者
 */
public final class MQConsumer {
    static private final Logger LOGGER = LoggerFactory.getLogger(MQConsumer.class);

    private MQConsumer() {
    }

    static public void init() {
        // 創建消息隊列消費者
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("herostory");

        // 設置 nameServer 地址
        consumer.setNamesrvAddr("localhost:9876");

        try {
            // 訂閱戰報結果
            consumer.subscribe("MyTopic", "*");

            // 註冊回調
            consumer.registerMessageListener(new MessageListenerConcurrently() {
                @Override
                public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgExtList, ConsumeConcurrentlyContext ctx) {
                    for (MessageExt msgExt : msgExtList) {
                        // 解析戰鬥結果消息
                        String mqMsg = JSONObject.parseObject(
                                msgExt.getBody(),
                                String.class
                        );

                        LOGGER.info("客戶端收到消息{}", mqMsg);

                    }

                    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                }
            });

            // 啓動消費者
            consumer.start();
        } catch (Exception ex) {
            LOGGER.error(ex.getMessage(), ex);
        }
    }
}

注意: namesrv的配置需要和啓動broker時的地址一致!

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章