Springboot集成RocketMQ
1、pom.xml中增加RocketMQ依赖
<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency>
2、application.yml中添加MQ配置
rocketmq: #单机模式 #name-server: 192.168.2.24:9876 #集群模式 name-server: 192.168.2.24:9876;192.168.2.54:9876 producer: group: my-producer
3、此次模拟两种消息:字符串和自定义实体类。
在该实体类(MyEntity.java)中构造了一个方便实例化该类的有参构造函数,导致JVM不会添加默认的无参构造函数,而jackson的反序列化需要无参构造函数,因此报错。
解决办法:在实体类中添加一个无参构造函数。
@Data @AllArgsConstructor @NoArgsConstructor public class MyEntity implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; }
4、生产者,分别为topic值为“topic-1”、“topic-2”发送分别为自定义实体类的消息和字符串
RocketMQ发送消息的方式非常丰富,适应于多种场景,可自行学习。
@Component @Slf4j @RequestMapping("/myProducer") public class MyProducer { @Resource private RocketMQTemplate rocketMQTemplate; @RequestMapping("/sendMsg") public void sendMsg(){ rocketMQTemplate.send("topic-1", MessageBuilder.withPayload(new MyEntity("李四",44)).build()); rocketMQTemplate.convertAndSend("topic-2", "你好啊 张三"); } }
5、消费者
##消费topic-1中的消息,用MyEntity接收 @Component @Slf4j @RocketMQMessageListener(topic = "topic-1",consumerGroup = "consumer-topic-1") public class MyConsumer1 implements RocketMQListener<MyEntity> { @Override public void onMessage(MyEntity myEntity) { log.info("topic-1,接收数据:{}",JSON.toJSONString(myEntity)); log.info("topic-1,接收数据age:{}",myEntity.getAge()); } } ##消费topic-1中的消息,消息体为String。 ##用字符串也可以接受Entity的消息体,为jsonString,但是字符串无法接收Entity @Component @Slf4j @RocketMQMessageListener(topic = "topic-2",consumerGroup = "consumer-topic-2") public class MyConsumer2 implements RocketMQListener<String> { @Override public void onMessage(String message) { log.info("topic-2,接收数据:{}",message); } }
6、调用消费者发送消息,可以看到已经成功消费
com.zjk.rocketMQ.Consumer.MyConsumer1 : topic-1,接收数据:{"age":44,"name":"李四"} com.zjk.rocketMQ.Consumer.MyConsumer1 : topic-1,接收数据age:44 com.zjk.rocketMQ.Consumer.MyConsumer2 : topic-2,接收数据:你好啊 张三