Bootstrap

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

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;