更改“正在递送”的邮件状态

时间:2014-01-29 06:32:03

标签: jms jboss7.x spring-batch hornetq

在我的应用程序中,我在JBoss 7 AS上设置了一个队列(HornetQ)。 一旦收到消息(在数据库中保存值等),我就使用Spring批处理做一些工作,然后消费者提交JMS会话。 有时,当处理消息时出现异常时,消费者的例外情况会突然中止。 并且消息仍处于“交付”状态。在我的生产队列中,此状态中大约有30条消息 我尝试重新启动消费者,但这些消息的状态没有改变。删除这些的唯一方法 队列中的消息是重新启动队列。但在此之前我想要一种方法来阅读这些消息 它们可以被纠正并再次发送到队列进行处理。 我已经尝试使用QueueBrowser来读取它们,但它不起作用。我在Google上搜索了很多但是没有 找到任何方式来阅读这些消息。

我正在使用Traacted会话,在处理完消息后,我正在调用:

session.commit();

这发送确认。 我正在实施spring的

org.springframework.jms.listener.SessionAwareMessageListener 

接收消息然后处理它们。 在处理消息时,我使用spring批处理在数据库中插入一些数据。 对于特定情况,它会尝试插入太大而无法插入列中的数据。 它抛出异常并且事务被中止。

现在,我已经修复了我的生产者和消费者没有这样的数据,所以不应该再发生这种情况。

但我的问题是我的生产队列中的30个“交付”状态消息呢?我想阅读它们,以便纠正它们并再次发送到队列进行处理。有没有办法阅读这些消息?一旦我知道了他们的内容,我就可以重新启动队列并再次提交(纠正后)。

期待感谢你,

Suvarna

2 个答案:

答案 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

请参阅https://issues.jboss.org/browse/HORNETQ-763