在生产者连接关闭之前未使用JMS消息:-(

在生产者连接关闭之前未使用JMS消息:-(,jms,activemq,Jms,Activemq,我对JMS比较陌生,在实现我的第一个真正的应用程序时遇到了一个奇怪的问题。我非常渴望得到任何帮助或建议 背景:我使用AtiveMQ(java)作为具有非事务性、非持久性队列的消息代理 设计:我有一个基于单个队列的直接生产者/消费者系统。许多节点(目前为2个)将消息放在队列上或从队列中消费。选择器用于过滤节点接收的消息 问题是:生产者成功地将其项目放入队列(我已使用web界面验证了它们是否在队列中),但是消费者仍然被阻止并且不读取它们。只有当我关闭生产者中的JMS连接时,消费者才会跳入生命并按预期

我对JMS比较陌生,在实现我的第一个真正的应用程序时遇到了一个奇怪的问题。我非常渴望得到任何帮助或建议

背景:我使用AtiveMQ(java)作为具有非事务性、非持久性队列的消息代理

设计:我有一个基于单个队列的直接生产者/消费者系统。许多节点(目前为2个)将消息放在队列上或从队列中消费。选择器用于过滤节点接收的消息

问题是:生产者成功地将其项目放入队列(我已使用web界面验证了它们是否在队列中),但是消费者仍然被阻止并且不读取它们。只有当我关闭生产者中的JMS连接时,消费者才会跳入生命并按预期消费消息

这对我来说似乎很奇怪,当然你不应该完全挂断生产者连接,消费者才能从队列中读取。我一定是在什么地方出错了(可能是会话)但目前可能出错的事情太多了,我不知道是什么导致了这种行为

对于任何关于解决方案、问题原因或如何继续调试的提示,我们将不胜感激

谢谢你抽出时间


p.S如果您需要任何其他信息,我很乐意提供这些信息

如果没有看到代码,很难说,但听起来制作人是交易的。您不应该关闭制作人以便消费者接收消息,但交易的制作人在您调用commit之前不会发送消息。其他需要检查的事项连接已经启动。另外,如果您有多个使用者,您应该查看预回迁设置,以确保一个使用者不会占用所有消息,可能需要将预回迁设置为1,但如果不进一步了解您的用例,则很难说。

如果不查看代码,很难说,但听起来像是生产者是事务性的。您不必关闭生产者才能让使用者接收消息,但事务性生产者在您调用commit之前不会向其发送消息。要检查的其他事项是连接是否已启动。此外,如果您有多个使用者,则应查看预回迁设置,以确保一个使用者不接收消息“t hog all messages,可能需要将prefetch设置为1,但如果不进一步了解您的使用情况,很难说。

嗨,Tim,谢谢您的响应。作为调试步骤,我尝试在每次生产者消息发送后添加session.commit,以防会话被处理。这只会导致“IllegalStateException:非交易会话”因此我不认为这是问题所在。真正古怪的行为是,我可以看到消息,甚至可以通过代理的web界面浏览它们。它们显示为已制作,只有在关闭制作人连接之前,消费者才会收到:-(最好的办法是创建JUnit测试用例并将其发布到ActiveMQ邮件列表或创建JIRA问题。嗨,Tim,感谢您的响应。作为调试步骤,我尝试在会话被事务处理的情况下,在每次生产者消息发送后添加session.commit。这只会导致“IllegalStateException:非事务会话”“所以我不认为这是问题所在。真正古怪的行为是,我可以看到这些消息,甚至可以通过经纪人的web界面浏览它们。它们是在制作时显示的,只有在关闭制作人连接之前,消费者才会收到:-(最好的办法是创建一个JUnit测试用例并将其发布到ActiveMQ邮件列表或创建一个JIRA问题。