これが私がしばらく取り組んできた問題です...私はCamel(v2.10.2)を使用して、ファイルシステム、サーバー、および組織内外(B2B)間でデータを移動するための多くのファイルルートを設定しています. それぞれのディレクトリにデータ ファイルとシグナル ファイルがあり、一部のルートは短命ですが、他のルートは異なる VM/サーバーでサービスとして実行されます。これらのプロセス (ルート) は、異なる UNIX の「機能」ID で実行されますが、可能であれば同じ UNIX グループに属するように試みられます...
もちろん、UNIX では常にファイル/ディレクトリのアクセス許可の問題が発生する可能性があります...そしてそれが私が直面している/解決しようとしている問題です。
私は を使用し、をチェックする内のDefaultErrorHandler
カスタムを介して交換の成功または失敗を記録します。シグナル・ファイルは、成功した場合は宛先に移動され、失敗した場合は dir に移動され、システム全体のアラート・ログにアラートが書き込まれます (Tivoli によってチェックされます)。RoutePolicy
onExchangeDone(...)
Exchange.isFailed()
.error
ファイル ルートは、ファイルのピックアップ中に発生したエラーなどをconsumer.bridgeErrorHandler=true
基本的に、UNIX パーミッションに関連するエラーがある場合は、影響を受けたルートを停止 (およびおそらく削除) し、これが発生したこととその理由を明確に示します。パーミッションの問題はプログラムで簡単に解決できないため、停止して警告するだけです。オプション。
そこで、問題を引き起こすテスト ケースを説明します...
App_A は ./data/ にいくつかのデータ ファイルを作成します。その後、App_A は./signal/に同じ数のシグナル ファイルを作成しますが、「データ」関連のバグにより 、対応するデータ ファイルを持たないシグナル ファイル./signal/acc_xyz.csvも作成します。
ルートは./signal/acc_xyz.csvの処理を開始し、「検証プロセス」は./data/acc_xyz.csvが存在しないことを検出し、これを示すために例外をスローするため、それ以降の交換の処理を停止します。
File
コンポーネントは、シグナル ファイルを ./signal/.error/ に移動するように構成されてmoveFailed=.error
いますが、このディレクトリは、Java プロセスを実行している機能ユーザー ID にロックされています (理由は心配しないでください)。内部の Camel 処理はGenericFileOperationFailedException
、根本的な「許可が拒否されました」問題の原因となります。
ああ、同じ信号ファイルが何度も何度も処理されて...
この「二次エラー」をコードに反映させようとしましたが、失敗したため、ルートを停止できません。
これと他の内部 Camel エラーをコード/例外ハンドラー/その他に伝達し、ログに記録して飲み込むだけでなく、どうすれば取得できますか?
前もって感謝します
わかりました log4j からの詳細...一連の時間に注意してください
キャメルの DefaultErrorHandler:
2013-04-25 15:06:26,001 [Camel (camel-1) thread #0 - file:///FTROOT/fileTransfer/outbound/signal] ERROR (MarkerIgnoringBase.java:161) - Failed delivery for (MessageId: ID-rwld601-rw-discoverfinancial-com-60264-1366902384246-0-1 on ExchangeId: ID-rwld601-rw-discoverfinancial-com-60264-1366902384246-0-2). Exhausted after delivery attempt: 1 caught: java.lang.IllegalStateException: missingFile: route [App_A.outboundReceipt] has missing file at /FTROOT/fileTransfer/outbound/data/stuff.log
java.lang.IllegalStateException: missingFile: route [App_A.outboundReceipt] has missing file at /FTROOT/fileTransfer/outbound/data/stuff.log
at com.myco.mft.process.BaseFileRouteBuilder.checkFile(BaseFileRouteBuilder.java:934)
RoutePolicy.onExchangeDone(...) を介したアラート ロガー - この時点で、交換は失敗して完了しました。
2013-04-25 15:06:26,011|Camel (camel-1) thread #0 - file:///FTROOT/fileTransfer/outbound/signal|exchange|App_A.outboundReceipt|signalFile=/FTROOT/fileTransfer/outbound/signal/stuff.log|there has been a routing failure|missingFile: route [App_A.outboundReceipt] has missing file at /FTROOT/fileTransfer/outbound/data/stuff.log
Camel エンドポイントの後処理 - これは、Camel が私に伝達しないものです:
2013-04-25 15:06:26,027 [Camel (camel-1) thread #0 - file:///FTROOT/fileTransfer/outbound/signal] WARN (GenericFileOnCompletion.java:149) - Rollback file strategy: org.apache.camel.component.file.strategy.GenericFileDeleteProcessStrategy@104e28b for file: GenericFile[/FTROOT/fileTransfer/outbound/signal/stuff.log]
2013-04-25 15:06:28,038 [Camel (camel-1) thread #0 - file:///FTROOT/fileTransfer/outbound/signal] WARN (MarkerIgnoringBase.java:136) - Caused by: [org.apache.camel.component.file.GenericFileOperationFailedException - Error renaming file from /FTROOT/fileTransfer/outbound/signal/stuff.log to /FTROOT/fileTransfer/outbound/signal/.error/stuff.log]
org.apache.camel.component.file.GenericFileOperationFailedException: Error renaming file from /FTROOT/fileTransfer/outbound/signal/stuff.log to /FTROOT/fileTransfer/outbound/signal/.error/stuff.log
at org.apache.camel.component.file.FileOperations.renameFile(FileOperations.java:72)
...
Caused by: java.io.FileNotFoundException: /FTROOT/fileTransfer/outbound/signal/stuff.log (Permission denied)
at java.io.FileInputStream.open(Native Method)