为啥我的消息消费者没有收到所有其他消息?
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 控制台连接到代理并检查队列上的订阅以查看有多少订阅。
【讨论】:
以上是关于为啥我的消息消费者没有收到所有其他消息?的主要内容,如果未能解决你的问题,请参考以下文章