Springboot整合RocketMQ(一)
由於項目上需要用到RocketMQ來做消息同步。本文主要記錄自己RocketMQ的學習歷程。也將自己的經驗分享給大家。
本文測試時,博主已經將RocketMQ安裝到了虛擬機上,並且配置了RocketMq-console-ng.
發送同步消息
- 項目POM文件
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.6.1</version>
</dependency>
- Producer(生產者)
public class Producer {
public static void main(String[] args)throws Exception {
DefaultMQProducer producer = new DefaultMQProducer("xoxogp");
//設置nameserver
producer.setNamesrvAddr("192.168.37.128:9876");
producer.start();//啓動
// topic 消息將要發送的地址
// body 消息中的內容
Message msg1 = new Message("myTopic001", "這個是第一條消息".getBytes());
Message msg2 = new Message("myTopic001", "這個是第二條消息".getBytes());
Message msg3 = new Message("myTopic001", "這個是第三條消息".getBytes());
ArrayList<Message> list = new ArrayList<Message>();
list.add(msg1);
list.add(msg2);
list.add(msg3);
//同步消息發送
SendResult sendResult = producer.send(list);
System.out.println(sendResult);
}
}
- Consumer (消費者)
public class Consumer {
public static void main(String[] args) throws Exception {
//消費組
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("xxoocsm");
consumer.setNamesrvAddr("192.168.37.128:9876");
//topic 消息地址
// subExpression 過濾器 * 表示不過濾
consumer.subscribe("myTopic001", "*");
//監聽消息
consumer.registerMessageListener(new MessageListenerConcurrently() {
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
System.out.println(new String(msg.getBody()));
}
//返回消費狀態
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
System.out.println("Consumer 02 start...");
}
}
- 運行示例
- Producer(生產者)
- Consumer (消費者)
發送異步消息
想要快速發送消息,又不想丟失的時候可以使用異步消息
- Producer(生產者)
public class Producer2 {
public static void main(String[] args)throws Exception {
DefaultMQProducer producer = new DefaultMQProducer("xoxogp");
//nameserver
producer.setNamesrvAddr("192.168.37.128:9876");
producer.start();
Message message = new Message("myTopic001", "xxoo".getBytes());
// producer.setRetryTimesWhenSendAsyncFailed(retryTimesWhenSendAsyncFailed);
//消息異步發送
producer.send(message,new SendCallback() {
//發送成功的處理邏輯
public void onSuccess(SendResult sendResult) {
System.out.println("消息發送成功");
System.out.println("sendResult :" + sendResult);
}
//發送異常的處理邏輯
public void onException(Throwable e) {
e.printStackTrace();
System.out.println("發送異常");
}
});
}
}
消費者同上。
注意
- 批量消息要求必要具有同一topic、相同消息配置
- 不支持延時消息
- 建議一個批量消息最好不要超過1MB大小
- 如果不確定是否超過限制,可以手動計算大小分批發送