Java進階(7)之mac 安裝rocketmq以及與springboot結合使用

安裝RocketMQ Server

下載bin壓縮包

rocketmq官網中下載最新bin壓縮文件(當前最新版本是4.7.0)

環境配置

.bash_profile文件中添加環境變量:

export ROCKETMQ_HOME=/yourPath/rocketmq-all-4.7.0-bin-release

啓動路由

cdrocketmq-all-4.7.0-bin-release目錄下執行命令:

  • 啓動路由:
nohup sh bin/mqnamesrv &
  • 查看nameserver日誌
tail -f ~/logs/rocketmqlogs/namesrv.log
  • 啓動成功有如下日誌
INFO main - The Name Server boot success

啓動broker

cd到cd到rocketmq-all-4.7.0-bin-release目錄下執行命令:

  • 啓動(IP和端口可自行更改)
nohup sh bin/mqbroker -n localhost:9876 & 
  • 查看日誌
tail -f ~/logs/rocketmqlogs/broker.log
  • 啓動成功日誌
 boot success

安裝RocketMQ可視化工具

  • github官網搜索rocketmq external,克隆到本地
  • 使用idea打開rocketmq-console項目,下載相關依賴
  • application.properties中配置namesrvAddr,這裏的ip:portrocketmq server是一一對應的:
rocketmq.config.namesrvAddr=localhost:9876
  • 啓動之後可看到如圖所示UI
  • 在這裏插入圖片描述

SpringBoot配置RocketMQ

添加依賴

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.7.0</version>
</dependency>
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-remoting</artifactId>
    <version>4.7.0</version>
</dependency>
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-common</artifactId>
    <version>4.7.0</version>
</dependency>

生產者代碼

@Slf4j
@Component
public class Producer {
    private String producerGroup = "test_producer";
    private DefaultMQProducer producer;

    public Producer(){
        //示例生產者
        producer = new DefaultMQProducer(producerGroup);
        //不開啓vip通道 開通口端口會減2
        producer.setVipChannelEnabled(false);
        //綁定name server
        producer.setNamesrvAddr("localhost:9876");
        start();
    }
    /**
     * 對象在使用之前必須要調用一次,只能初始化一次
     */
    private void start(){
        try {
            this.producer.start();
        } catch (MQClientException e) {
            e.printStackTrace();
        }
    }

    public DefaultMQProducer getProducer(){
        return this.producer;
    }
    /**
     * 一般在應用上下文,使用上下文監聽器,進行關閉
     */
    public void shutdown(){
        this.producer.shutdown();
    }
}

消費者代碼

@Slf4j
@Component
public class Consumer {

    @Resource
    private RocketMQProperties rocketMQProperties;

    /**
     * 消費者實體對象
     */
    private DefaultMQPushConsumer consumer;
    /**
     * 消費者組
     */
    public static final String CONSUMER_GROUP = "test_consumer";
    /**
     * 通過構造函數 實例化對象
     */
    public Consumer() throws MQClientException {

        consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
        consumer.setNamesrvAddr("localhost:9876");
        // 訂閱PushTopic下Tag爲push的消息,都訂閱消息
        consumer.subscribe("firstPushTopic", "push");
        // 程序第一次啓動從消息隊列頭獲取數據
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        //可以修改每次消費消息的數量,默認設置是每次消費一條
        consumer.setConsumeMessageBatchMaxSize(1);
        // //註冊消費的監聽 並在此監聽中消費信息,並返回消費的狀態信息
        consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
            // msgs中只收集同一個topic,同一個tag,並且key相同的message
            // 會把不同的消息分別放置到不同的隊列中
            try {
                for (Message msg : msgs) {

                    //消費者獲取消息 這裏只輸出 不做後面邏輯處理
                    String body = new String(msg.getBody(), "utf-8");
                    log.info("Consumer-獲取消息-主題topic爲={}, 消費消息爲={}", msg.getTopic(), body);
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return ConsumeConcurrentlyStatus.RECONSUME_LATER;
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });

        consumer.start();
        System.out.println("消費者 啓動成功=======");
    }
}

測試

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

        new Consumer();

        Producer producer = new Producer();
        Message message = new Message();
        message.setTopic("firstPushTopic");
        message.setTags("push");
        message.setBody("hello".getBytes());
        try {
            producer.getProducer().send(message);
        } catch (RemotingException e) {
            e.printStackTrace();
        } catch (MQBrokerException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

注意:其中的topictags必須一一對應!

遇到的問題

github下載很慢

嘗試命令行克隆或者下載zip包,或者添加阿里雲的鏡像

service not available now, maybe disk full, CL: 0.92 CQ: 0.92 INDEX: 0.92

我mac內存全盤250G,然而只剩下10幾個G,確實不太夠,但爲了能繼續使用rocketmq server,需要做下配置:

  • rocketmq-all-4.7.0-bin-release/bin下找到runbroker.cmd,添加代碼:
set "JAVA_OPT=%JAVA_OPT% -Drocketmq.broker.diskSpaceWarningLevelRatio=0.98"
  • rocketmq-all-4.7.0-bin-release/bin下找到runserver.cmd,將內存改大一些:
set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m"

修改配置之後,重啓rocketmq的路由和broker,即可解決問題!

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