在我的应用程序中,我在JBoss 7 AS上设置了一个队列(HornetQ)。 一旦收到消息(在数据库中保存值等),我就使用Spring批处理做一些工作,然后消费者提交JMS会话。 有时,当处理消息时出现异常时,消费者的例外情况会突然中止。 并且消息仍处于“交付”状态。在我的生产队列中,此状态中大约有30条消息 我尝试重新启动消费者,但这些消息的状态没有改变。删除这些的唯一方法 队列中的消息是重新启动队列。但在此之前我想要一种方法来阅读这些消息 它们可以被纠正并再次发送到队列进行处理。 我已经尝试使用QueueBrowser来读取它们,但它不起作用。我在Google上搜索了很多但是没有 找到任何方式来阅读这些消息。
我正在使用Traacted会话,在处理完消息后,我正在调用:
session.commit();
这发送确认。 我正在实施spring的
org.springframework.jms.listener.SessionAwareMessageListener
接收消息然后处理它们。 在处理消息时,我使用spring批处理在数据库中插入一些数据。 对于特定情况,它会尝试插入太大而无法插入列中的数据。 它抛出异常并且事务被中止。
现在,我已经修复了我的生产者和消费者没有这样的数据,所以不应该再发生这种情况。
但我的问题是我的生产队列中的30个“交付”状态消息呢?我想阅读它们,以便纠正它们并再次发送到队列进行处理。有没有办法阅读这些消息?一旦我知道了他们的内容,我就可以重新启动队列并再次提交(纠正后)。
期待感谢你,
Suvarna
答案 0 :(得分:1)
这一切都取决于您使用的交易模式。
例如,如果您使用交易:
// session here is a TX Session
MessageConsumer cons = session.createConsumer(someQueue);
session.start();
Message msg = consumer.receive...
session.rollback(); // this will make the messages to be redelivered
如果您使用非TX:
// session here is auto-ack
MessageConsumer cons = session.createConsumer(someQueue);
session.start();
// this means the message is ACKed as we receive, doing autoACK
Message msg = consumer.receive...
//however the consumer here could have a buffer from the server...
// if you are not using the consumer any longer.. close it
consumer.close(); // this will release messages on the client buffer
或者,您也可以在connectionFactory上设置consumerWindowSize = 0。
这是在2.2.5上,但在以下版本中从未改变:
http://docs.jboss.org/hornetq/2.2.5.Final/user-manual/en/html/flow-control.html
我涵盖了我能想到的所有可能性,因为你没有具体说明你的消费方式。如果你向我提供更多细节,那么我可以告诉你更多:
答案 1 :(得分:0)
您确实可以使用jmx(例如jconsole)
在队列中读取您的消息在Jboss As7中,您可以通过以下方式执行此操作: 的MBean> jboss.as>消息>默认> myJmsQueue>操作
listMessagesAsJson
<强> [编辑] 强>
从2.3.0开始,您有针对此特定情况的专用方法:
listDeliveringMessages