2012-01-26 7 views
2

以下のメソッドが失敗したり、例外が発生してもmsgを使用し続けるという問題が発生しました。私はその機能を捕捉中にロールバックし、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メソッドを処理することができます。

関連する問題