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,接收数据:你好啊 张三