0
  • 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.

0 Answers0