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時的地址一致!