2017-07-22 8 views
1

以下は、私のアプリケーションで使用している遅延コードです。出力チャネルcheckMessageInProgressは、メッセージを処理または遅延する必要があるかどうかをチェックするデータベースストアドプロシージャ呼び出しです。 メッセージを再度遅延させる必要がある場合は、再試行回数が増えます。 3つの遅延後、カスタムアプリケーション例外が発生します。遅延メッセージ用にjdbcメッセージストアを使用しています。メッセージが3回遅延し、例外が発生した場合、メッセージはデータベーステーブルから削除されず、サーバーは再起動時にこれらのメッセージを選択します。遅延が3回発生した場合にメッセージがテーブルから削除されるようにする方法Spring統合遅延 - Jdbcメッセージストア:メッセージが削除されない

<int:chain input-channel="delayerChannel" 
    output-channel="checkMessageInProgress"> 
    <int:header-enricher> 
    <!-- Exception/ERROR handling for flows originating from Delayer --> 
     <int:header name="errorChannel" value="exceptionChannel" 
      overwrite="true" /> 
     <int:header name="retryCount" overwrite="true" type="int" 
      expression="headers['retryCount'] == null ? 0 : headers['retryCount'] + 1" /> 
    </int:header-enricher> 
    <!-- If retryCount maxed out -discard message and log it in error table --> 
    <int:filter expression="(headers['retryCount'] lt 3)" 
     discard-channel="raiseExceptionChannel"> 
    </int:filter> 
    <!-- Configurable delay - fetch from property file --> 
    <int:delayer id="Delayer" default-delay="${timeout}" 
     message-store="mymessageStore"> 
     <!-- Transaction management for flows originating from the Delayer --> 
     <int:transactional transactionmanager="myAppTransactionManager"/> 
    </int:delayer> 
</int:chain> 

答えて

1

これは驚きではありません。トランザクション・リソース(データベース)を使用するため、ダウンストリームの例外によってトランザクション・ロールバックが発生するため、データの削除は発生しません。

例外をスローする前に、別のスレッドにシフトメッセージを考慮してください。そうすれば、トランザクションはコミットされます。

関連する問題