このアプリケーションには、エラー処理メカニズムがあり、エラーに対してランタイム例外をスローします。奇妙な振る舞いに気づき、これの根底にあるメカニズムを理解したい
1)状況1:ServiceActivatorからスローされた例外がMessageHandlingExceptionに変換されます
ServiceActivatorでエラーが発生すると、例外がスローされます。ErrorChannelで受け取るメッセージには、PayLoadasorg.springframework.integration.MessageHandlingException
と実際の例外がスローされます。 cause
2)状況2:フィルターからスローされた例外がMessageHandlingExceptionでマスクされていない
Filterでエラーが発生し、例外がスローされた場合、PayLoadは実際の例外であり、org.springframework.integration.MessageHandlingException
少し質問があります:
- ServiceActivatorからの例外スローがFilterとは異なる動作をする理由
- errorChannelと関連インフラストラクチャを利用しながら、Spring統合プロジェクトでのエラー処理に関する「ベストプラクティス」はありますか?
アップデート1:
フィルタは、フィルタチェーンの一部であるAbstractFileListFilterを拡張します-FileListFilterを実装するカスタムCompositeFileFilter
CompositeFileFilterはfile:inbound-channel-adapterによって使用されており、以下で宣言されているチャネルに出力を渡します。
<int:channel
id="channelForFilesComingIn"
datatype="java.io.File"
>
<int:dispatcher task-executor="dispatchExecutor" />
</int:channel>
アップデート2:
私たちがやろうとしているのは、ファイルシステムからファイルを読み取って処理することです。ファイル読み取りの部分で、file:inbound-channel-adapter
完全にアップロードされていないファイルや命名基準を満たしていないファイルをフィルタリングするCompositeFilterで使用します。
すべてのフィルターが通過した後、ファイルは処理のためにServiceActivatorに渡されます
上記のいずれか(フィルターチェーンまたはサービス)で、エラー状態が発生した場合は、DBおよび電子メールで報告する必要があります。これを実現するために、errorChannelによってキャッチされ、特殊なチャネルに渡されるApplicationExceptionをスローします。