2014-01-29 29 views
2

在我的應用程序中,我有一個在JBoss 7 AS上設置的隊列(HornetQ)。 一旦收到消息(保存數據庫中的值等),然後消費者提交JMS會話,我就使用Spring批處理來完成一些工作。 有時當處理消息時出現異常時,用戶的執行突然中止。 消息仍處於「交付」狀態。我的生產隊列中有大約30條消息處於此狀態。
我已嘗試重新啓動使用者,但這些消息的狀態不會更改。從隊列中刪除這些 消息的唯一方法是重新啓動隊列。但在此之前,我想要一種方法來讀取這些消息,以便它們可以被糾正並再次發送到隊列進行處理。 我曾嘗試使用QueueBrowser閱讀它們,但它不起作用。我在谷歌搜索了很多,但不能 找到任何方式來閱讀這些消息。更改「正在交付」的郵件的狀態

我使用的事務會話,其中一旦處理了該消息,我打電話:

session.commit(); 

此發送確認。 我採取春天的

org.springframework.jms.listener.SessionAwareMessageListener 

到收到消息,然後對它們進行處理。 在處理消息時,我使用spring批處理在數據庫中插入一些數據。 對於特定情況,它會嘗試插入數據太大以致無法插入列中。 它引發異常並中止事務。

現在,我已經修復了我的生產者和消費者沒有這樣的數據,所以這種情況不應該再發生。

但我的問題是在我的生產隊列中的30「交付」狀態消息呢?我想讀取它們,以便它們可以更正並再次發送到隊列進行處理。有什麼方法可以閱讀這些消息嗎?一旦我知道他們的內容,我可以重新啓動隊列並重新提交(糾正後)。

感謝你在期待,

Suvarna

回答

1

這一切都取決於你所使用的交易模式。如果您使用非TX

// 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 

例如,如果您使用的交易

// 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

我「米覆蓋你如何消耗所有我能想到的,因爲你不是特定的可能性。如果你向我提供更詳細的話,我就可以告訴你更多:

+0

嗨Clebert,非常感謝你的快速和詳細的答覆。它有幫助。 我編輯了我的問題有更多的細節。你能幫忙嗎? – SNJoshi

+0

我已經回答了..你必須在你的東西失敗時調用回滾..或關閉它。如果你打開它,它將保持這種狀態。 –

+0

再次感謝您的回覆。但我不明白,我無法閱讀30條「交付」狀態消息。消費者 讀取並處理添加到隊列中的新消息,但不讀取舊消息。我試圖創建另一個消費者 ,但這些舊消息似乎被卡住了。 :( – SNJoshi

0

您確實可以讀取使用JMX您的隊列中的消息(與例如JConsole的)

到JBoss AS7,你可以做到這一點下面方式: 的MBeans> jboss.as>消息>默認> myJmsQueue>運營

listMessagesAsJson

[編輯]

由於2.3.0你有這種特殊情況下的專用方法:

listDeliveringMessages

https://issues.jboss.org/browse/HORNETQ-763