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