刚刚开始学习rocketmq,看了一些帖子发现基本没有说到消息内容的,自己学习中发现的问题与解决方法记录一下.
post 请示演示,一个对象,与一个普通参数
后台代码部分:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.32</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<artifactId>lombok</artifactId>
<groupId>org.projectlombok</groupId>
</dependency>
<!-- 常用工具类 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.9</version>
</dependency>
<!--rocketmq-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.6.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties
rocketmq.name-server:localhost:9876
rocketmq.producer.group:my-producer-group
演示实体类,注释部分要注意,调试了好久找到的解决方法
@Data
public class OrderEntity implements Serializable {
private int orderId;
private String orderName;
/**
* fastjson中解析如果没有构造函数会报错
* JSONObject.toJavaObject(jo, OrderEntity.class);
*/
public OrderEntity() {
}
}
import com.alibaba.fastjson.JSONObject;
import com.example.demo.entity.OrderEntity;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/sendMsg")
public String sendMsg(@RequestBody OrderEntity entity, @RequestParam String name) {
for (int i = 0; i < 2; i++) {
//只传一个对象时
//JSONObject obj = (JSONObject) JSONObject.toJSON(entity);
JSONObject obj = new JSONObject();
obj.put("name", name);
obj.put("entity", entity);
// 投递消息到master主题中
// 投递消息到主题的tags中,格式为:主题:tags 或者使用Message类设置tags
rocketMQTemplate.convertAndSend("TopicTest:TagA", obj);
}
log.info(" success ===============================");
return "success";
}
ConsumerController 是监听方法,无需手动调用,producer 生产发送消息后,cosumer会持续发送心跳自动运行消费方法,可根据不同的Topic与tags实现不同的业务.
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.entity.OrderEntity;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@RocketMQMessageListener(topic = "TopicTest", consumerGroup = "Test_consumer_group",
consumeMode = ConsumeMode.ORDERLY, consumeThreadMax = 1, // 指定消费者线程数量
selectorExpression = "TagA") // 指定tags消费
public class ConsumerController implements RocketMQListener<MessageExt> {
@Override
public void onMessage(MessageExt message) {
JSONObject obj = (JSONObject) JSON.parse(message.getBody());
//只传一个对象时
//OrderEntity entity = JSONObject.toJavaObject(obj, OrderEntity.class);
String str = obj.getString("name");
JSONObject jo = obj.getJSONObject("entity");
OrderEntity entity = JSONObject.toJavaObject(jo, OrderEntity.class);
log.info(Thread.currentThread().getId() + ",consumer:" + "队列:" + message.getQueueId() +
"," + new String(message.getBody()));
log.info("消息ID:" + message.getMsgId() + ", tags:" + message.getTags());
log.info(str + "==============================");
log.info(entity.getOrderName() + "==============================" + entity.getOrderId());
}
}
我本机使用的是windows10,单机master,刚才开始学习,传参部分只有自己慢慢摸索使用,
消息队列中中broker启动命令十分重要,如果不加上后面的自动创建主题,运行也会出问题,而且在控制面板中也不能添加Topic.
start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true
消息测试过多时,难免有未被消费的消息,可作以下删除,重新运行后会自动生成.
https://blog.csdn.net/qq_36881887/article/details/103723443