2012-01-26 25 views
2

我遇到了如果我的方法失敗或者出現異常,我仍然使用消息的問題。我希望該功能在捕獲期間執行回滾,並將msg放回隊列/主題。將onMessage()方法轉換爲原子操作

public void onMessage(Message message) 
{ 

    String messageId = null; 
    Date messagePublished = null; 

    try 
    { 
     messageId = message.getJMSMessageID(); 
     messagePublished = new Date(message.getJMSTimestamp()); 
     LOGGER.info("JMS Message id =" + messageId + " JMS Timestamp= " + messagePublished); 
     process(message); 
     LOGGER.info(" returning from onMessage() successfully =" + messageId + " JMS Timestamp= " + messagePublished); 
    } 
    catch(Throwable t) 
    { 
     LOGGER.error("Exception:",t); 
     LOGGER.error(t.getStackTrace() + "\n Exception is unrecoverable."); 
     throw new RuntimeException("Failed to handle message.",t); 
    } 

} 

回答

1

您可以查看JMS中存在的不同確認模式。看到這篇文章http://www.javaworld.com/javaworld/jw-02-2002/jw-0315-jms.html

適合您的模式是客戶端模式。 所以基本上,客戶需要確認他們何時開始處理郵件。

您可以在調用進程(消息)之後調用確認,如果在進程(消息)方法中發生異常,則消息不會因爲您沒有確認而出現。我們之前對Oracle AQ使用了這種方法,它工作得很好。

這種方法意味着您不必擔心隊列上的消息事務(數據庫事務是另一回事)。您需要確保的唯一一件事就是您的應用可以處理呼叫,以處理(消息)與潛在的重複郵件

0

您應該可以讓您的onMessage方法成交。