为啥我的消息消费者没有收到所有其他消息?

Posted

技术标签:

【中文标题】为啥我的消息消费者没有收到所有其他消息?【英文标题】:Why is my message consumer not receiving every other message?为什么我的消息消费者没有收到所有其他消息? 【发布时间】:2014-11-12 12:37:20 【问题描述】:

我编写了一些代码来使用在 Glassfish 4 服务器上运行的 ActiveMQ 将 TestMessages 推送到队列中 如果我连续发送消息“A”、“B”、“C”、“D”、“E”、“F” 我只收到“A”、“C”、“E”

有人知道为什么吗?

消息生产者

public void sendMessage(String msg) 
    try 
        if (session == null) 
            session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
            queue = session.createQueue(QUEUE_NAME);
        
        messageProducer = session.createProducer(queue);
        Message message = createMessage(msg);
        messageProducer.send(message);
     catch (NamingException nex) 
        System.out.println("Messager - naming exception" + nex.getLocalizedMessage());
     catch (JMSException jex) 
        System.out.println("Messager - JMS exception" + jex.getLocalizedMessage());
    

消息消费者

public class Listener extends Thread implements MessageListener            
    private void run() 
        try 
            connectionFactory = new ActiveMQConnectionFactory(AMQ_USER, AMQ_PASS, url);
            connection = connectionFactory.createConnection();
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            queue = session.createQueue(QUEUE_NAME);
            consumer = session.createConsumer(queue);
            consumer.setMessageListener(this);
            connection.start();
         catch (NamingException nex) 
            log.error("Error in run()", nex);
         catch (JMSException jex) 
            log.error("Error in run()", jex);
        
    

    @Override
    public void onMessage(Message message) 
        if (message instanceof TextMessage) 
            try 
                TextMessage textMessage = (TextMessage) message;
                if (textMessage != null) 
                    System.out.println(textMessage.getText());
                
             catch (JMSException e) 
                e.printStackTrace();
            
        
    

提前致谢 标记

【问题讨论】:

完整性检查:您确定您只有一个消费者吗?没有例外?在特定时间段后发送的消息怎么样?没有异常队列? B、D 和 F 消息会发生什么 - 它们被消费/未处理? 您是否尝试将预取缓冲区设置为您的消费者?你只有一个消费者吗?如果有多个,可能需要杀死第一个消费者,以便其他消费者可以消费其他消息。 ActiveMQ 这样做是为了保证最大程度的彻底放置 听起来你有两个消费者,消息在两者之间循环。在代理的 Web 控制台上,转到 Queues 页面并查看您的队列的 Number Of Consumers 列;我敢打赌它是 2。如果是这样,请单击 Active Consumers 链接以获取有关另一个的更多详细信息,然后尝试找出它从哪里连接并杀死它。 感谢您的所有建议;我从来没有真正解决过这个问题,但这个项目还是被搁置了。我确实写了一个不同的简单消费者,它立即收到了所有丢失的消息。由于消费者是 Jira 插件,我只能猜测是插件 sdk 或 Jira 服务器导致了问题。 【参考方案1】:

这里显而易见的答案是,您在该目的地运行的消费者不止一个。每当队列有多个消费者时,消息就会在它们之间进行负载平衡。您可以通过 JMX 或使用 Web 控制台连接到代理并检查队列上的订阅以查看有多少订阅。

【讨论】:

以上是关于为啥我的消息消费者没有收到所有其他消息?的主要内容,如果未能解决你的问题,请参考以下文章

Kafka Consumer 在 Spring Boot 中没有收到消息

Node下RabbitMQ的使用

消费者没有收到来自 ActiveMQ 的消息

面试官杠上重复消费、消息堆积、消息丢失、顺序消息?

RocketMQ消费者没有成功消费消息的问题排查

kafka-python 消费者未收到消息