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大小
- 如果不确定是否超过限制,可以手动计算大小分批发送