- My rocketMQ producer can send messages to the queue, but the consumer cannot consume messages in a timely manner. Sometimes it will be delayed for about 10 seconds, and most of the time it will not consume messages at all.
- I checked the rocketMQ control panel, and the unconsumed messages look like this: messages look like
- My application.yml is:
rocketmq:
name-server: 127.0.0.1:9876
producer:
group: ProducerGroup
consumer:
group: ConsumerGroup
topic: MyTopic
- My maven dependencies are as follows:
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.12</version>
</parent>
....
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
- My producer side code is as follows:
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class RocketMQProducer {
private DefaultMQProducer producer;
@Autowired
public RocketMQProducer(@Value("${rocketmq.producer.group}") String producerGroup,
@Value("${rocketmq.name-server}") String nameServerAddress) {
producer = new DefaultMQProducer(producerGroup);
producer.setNamesrvAddr(nameServerAddress);
try {
producer.start();
} catch (MQClientException e) {
System.out.println("RocketMQProducer is wrong: ");
e.printStackTrace();
}
}
public void sendMessages(String topic, String tags, String message) {
try {
Message mqMessage = new Message(topic, tags, message.getBytes());
producer.send(mqMessage);
System.out.println("Message sent to queue: " + message);
} catch (Exception e) {
System.out.println("RocketMQProducer sendMessages() is wrong: ");
e.printStackTrace();
}
}
public void shutdown() {
producer.shutdown();
}
}
- Next, I called the sendMessages method of the producer in the NettyClientHandler code,redundant code omitted:
@Component
public class NettyClientHandler extends ChannelInboundHandlerAdapter {
@Autowired
private RocketMQProducer rocketMQProducer;
@Value("${rocketmq.consumer.topic}")
private String topic;
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
LogUtil.log("Client,channelActive");
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
LogUtil.log("Client,Received a message from the server");
if (msg instanceof ByteBuf) {
ByteBuf byteBuf = (ByteBuf) msg;
String message = byteBuf.toString(StandardCharsets.UTF_8);
rocketMQProducer.sendMessages(topic, "", message);
System.out.println("Received message: " + message);
}
}
}
- My consumer side code is as follows:
@Service
public class RocketMQCommonConsumerListener implements CommandLineRunner {
@Autowired
private subway.service.Service service;
@Value("${rocketmq.consumer.group}")
private String consumerGroup;
@Value("${rocketmq.name-server}")
private String nameServerAddress;
@Value("${rocketmq.consumer.topic}")
private String topic;
public void consumeMessages() {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(consumerGroup);
consumer.setNamesrvAddr(nameServerAddress);
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
System.out.println("consume_step1");
try {
consumer.subscribe(topic, "*");
System.out.println("consume_step2");
consumer.registerMessageListener(new MessageListenerOrderly() {
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> messages, ConsumeOrderlyContext context) {
StringBuilder sb = new StringBuilder();
boolean needMerge = true;
System.out.print("consume_step3, ");
long threadId = Thread.currentThread().getId();
System.out.println("Current Thread ID: " + threadId);
for (MessageExt message : messages) {
String str = new String(message.getBody());
System.out.println("RocketMQ received message:" + str);
}
return ConsumeOrderlyStatus.SUCCESS;
}
});
consumer.start();
} catch (MQClientException e) {
e.printStackTrace();
}
}
private void handleJson(String json) {
System.out.println("json data is :");
System.out.println(json);
System.out.println("\t\t\t============\t\t\t\n");
}
@Async("taskExecutor")
@Override
public void run(String... args){
consumeMessages();
}
}
I have modified it according to chatGPT3.5, and searched for answers on the Internet, but none of them can be solved. This question has troubled me for a long time, I am looking forward to the answer.