安裝RocketMQ Server
下載bin壓縮包
在 rocketmq官網中下載最新bin
壓縮文件(當前最新版本是4.7.0)
環境配置
在.bash_profile
文件中添加環境變量:
export ROCKETMQ_HOME=/yourPath/rocketmq-all-4.7.0-bin-release
啓動路由
cd
到rocketmq-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:port
跟rocketmq 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();
}
}
注意:其中的topic
和tags
必須一一對應!
遇到的問題
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,即可解決問題!