第49章 File2


File Component: Apache Camel 2.0 以降

File コンポーネントはファイルシステムへのアクセスを提供します。これにより、他の Apache Camel コンポーネントや 他のコンポーネントからのメッセージをディスクに保存できます。

URI 形式

file:directoryName[?options]
Copy to Clipboard Toggle word wrap
または
file://directoryName[?options]
Copy to Clipboard Toggle word wrap
directoryName は基礎となるファイルディレクトリーを表します。
URI にクエリーオプションは ?option=value&option=value&.. の形式で追加できます。
注記
Apache Camel は、開始ディレクトリーで設定されたエンドポイントのみをサポートします。そのため、directoryName はディレクトリーである必要があります。1 つのファイルのみを使用する場合は、fileName オプションを使用できます(例: fileName=thefilename )。また、開始ディレクトリーには ${ } プレースホルダーの動的式を含めることはできません。ここでも、fileName オプションを使用してファイル名の動的部分を指定します。
別のアプリケーションによって現在書き込まれているファイルの読み取りを回避する
JDK File IO API は、別のアプリケーションが現在ファイルを書き込み/コピーしているかどうかの検出に少し制限されていることに注意してください。実装は、OS プラットフォームによっても異なる場合があります。これにより、Apache Camel が別のプロセスでロックされていないと判断し、消費を開始する可能性があります。したがって、お使いの環境に応じて独自の調査を行う必要があります。これを支援するために、Apache Camel はさまざまな readLock オプションと、使用できる doneFileName オプションを提供します。「他のファイルを直接ドロップするフォルダーからのファイルの使用」 のセクションも参照してください。

Camel on EAP デプロイメント

このコンポーネントは、Red Hat JBoss Enterprise Application Platform (JBoss EAP) コンテナー上で簡素化されたデプロイメントモデルを提供する Camel on EAP (Wildfly Camel) フレームワークによってサポートされます。このモデルの詳細は、Deploying into a Web Server の Apache Camel on JBoss EAP の章を参照してください

URI オプション

Expand
名前 デフォルト値 説明
autoCreate true ファイルのパス名に不足しているディレクトリーを自動的に作成します。ファイルコンシューマーの場合は、開始ディレクトリーを作成することを意味します。ファイルプロデューサーの場合は、ファイルが書き込まれるディレクトリーを意味します。
bufferSize 128kb 書き込みバッファーのサイズ (バイト単位)。
fileName null File Language などの式 を使用して、ファイル名を動的に設定します。コンシューマーの場合は、ファイル名フィルターとして使用されます。プロデューサーの場合、書き込むファイル名を評価するために使用されます。式が設定されている場合、CamelFileName ヘッダーよりも優先されます。(注: ヘッダー自体も Expressionにすることができます)。式オプションは String 型と Expression タイプの両方をサポートします。式が String タイプである場合、これは 常に File Language を使用して評価されます。式が Expression タイプである場合、指定された Expression タイプが使用されます。これにより、たとえば OGNL 式を使用できます。コンシューマーの場合、これを使用してファイル名をフィルターリングできるため、たとえば、ファイル 言語 構文 mydata-${date:now:yyyyMMdd}.txt を使用して現在のファイルを使用できます。Camel 2.11 以降では、プロデューサーは既存の CamelFileName ヘッダーよりも優先される CamelOverruleFileName ヘッダーをサポートします。CamelOverruleFileName は一度だけ使用されるヘッダーであり、CamelFileName の一時的な保存を回避し、後で復元する必要があるため、簡単になります。
フラット化 false flatten は、ファイル名パスをフラット化して先頭のパスを削除するため、ファイル名のみになります。これにより、サブディレクトリーに再帰的に使用できますが、たとえばファイルを別のディレクトリーに書き込む場合、ファイルは単一のディレクトリーに書き込まれます。これをプロデューサーで true に設定すると、CamelFileName ヘッダーで認識されたファイル名はすべて先頭パスから取り除かれます。
charset null Camel 2.5: このオプションはファイルのエンコーディングを指定するために使用されます。camel は Exchange.CHARSET_NAME で Exchange プロパティーをこのオプションの値に設定します。
copyAndDeleteOnRenameFail true Camel 2.9: ファイルを直接変更できなかった場合に、フォールバックしてファイルのコピーと削除を行うかどうか。このオプションは FTP コンポーネントでは使用できません。
renameUsingCopy false
Camel 2.13.1: コピーおよび削除ストラテジーを使用して名前変更操作を実行します。これは主に、通常の名前変更操作が信頼できない環境で使用されます (たとえば、異なるファイルシステムまたはネットワーク間)。このオプションは、copyAndDeleteOnRenameFail パラメーターよりも優先されますが、これは追加の遅延後にのみ自動的にコピーおよび削除ストラテジーにフォールバックします。

コンシューマーのみ

Expand
名前 デフォルト値 説明
initialDelay 1000 ファイル/ディレクトリーの開始をポーリングするまでのミリ秒。
delay 500 次にファイル/ディレクトリーをポーリングするまでのミリ秒。
useFixedDelay true プール間の固定遅延を使用するには、true に設定します。それ以外の場合、固定レートが使用されます。詳細は、JDK の ScheduledExecutorService を参照してください。
runLoggingLevel TRACE Camel 2.8: コンシューマーはポーリング時に開始/完了のログ行をログに記録します。このオプションを使用すると、ログレベルを設定できます。
再帰 false ディレクトリーの場合は、すべてのサブディレクトリー内のファイルも検索します。
delete false true の場合、ファイルは正常に処理されると削除されます。
noop false true の場合、ファイルは移動または削除されません。このオプションは、読み取り専用データまたは ETL タイプの要件に適しています。noop=true の場合、Apache Camel は idempotent=true も設定し、同じファイルを何度も消費しないようにします。
preMove null File Language などの式 を使用して、処理 に移動する際にファイル名を動的に設定します。たとえば、進行中のファイルを order ディレクトリーに移動するには、この値を order に設定します。
move .camel File Language などの式 を使用して、処理 に移動する際にファイル名を動的に設定します。ファイルを .done サブディレクトリーに移動するには、.done と入力します。
moveFailed null File Language などの式 を使用して、処理 後に失敗したファイルを移動する際にファイル 名を動的に設定します。ファイルを エラー サブディレクトリーに移動するには、error を実行します。注記: ファイルを別の場所に移動すると、ファイルを別の場所に移動するとエラーを 処理 できるため、Apache Camel はファイルを再度取得できません。
include null ファイル名が正規表現パターンに一致する場合にファイルを含めるために使用されます(照合は Camel 2.17 以降と大文字と小文字を区別し ます)。
exclude null ファイル名が正規表現パターンに一致する場合にファイルを除外するために使用されます(一致は Camel 2.17 以降と大文字と小文字を区別し ます)。
antInclude null Camel 2.10: Ant スタイルのフィルターが含まれます(例: antInclude=\*{}*/*{}.txt )。コンマ区切り形式で複数の組み込みを指定できます。ant パスフィルターの詳細は、「ANT パスマッチャーを使用したフィルターリング」 を参照してください。
antExclude null Camel 2.10: Ant style filter exclusion.antIncludeantExclude の両方を使用する場合は、antInclude よりも antExclude が優先されます。コンマ区切り形式で複数の除外を指定できます。ant パスフィルターの詳細は、「ANT パスマッチャーを使用したフィルターリング」 を参照してください。
antFilterCaseSensitive true Camel 2.11: 大文字/小文字を区別しない Ant スタイルのフィルター。
idempotent false Apache Camel がすでに処理されたファイルをスキップできるように、Idempotent Consumer EIP パターンを使用するオプション。デフォルトでは、1000 エントリーを保持するメモリーベースの LRUCache を使用します。noop=true の場合、同じファイルを何度も使用することを避けるために、べき等性も有効になります。
idempotentKey Camel 2.11: カスタムのべき等キーを使用するには、以下を実行します。デフォルトでは、ファイルの絶対パスが使用されます。File Language を使用すると、ファイル名やファイルサイズを使用することができます(例: idempotentKey=$-$ )。
idempotentRepository null Pluggable repository as a org.apache.camel.processor.idempotent.MessageIdRepository class.指定がない場合はデフォルトで MemoryMessageIdRepository を使用し、べき等 性が true になります。
inProgressRepository memory org.apache.camel.processor.idempotent.MessageIdRepository クラスとしてのプラグ可能な in-progress リポジトリー。in-progress リポジトリーは、現在進行中のファイルが消費されていることを示すために使用されます。デフォルトでは、メモリーベースのリポジトリーが使用されます。
filter null org.apache.camel.component.file.GenericFileFilter クラスとしてのプラグ可能なフィルター。フィルターがその accept () メソッドで false を返す場合、ファイルをスキップします。Apache Camel には、camel-spring コンポーネントの ANT パスマッチャー フィルターも同梱されています。詳細は、以下のセクションを参照してください。
shuffle false Camel 2.16: ファイルのリストをシャッフルするには(ランダムな順序でのソート)
sorter null java.util.Comparator<org.apache.camel.component.file.GenericFile > クラスとしてのプラグ可能なソーター。
sortBy null File 言語 を使用した組み込みソート。ネストされたソートをサポートしているため、ファイル名でのソートと、2 つ目のグループとして変更日でソートできます。詳細は、以下のソートセクションを参照してください。
readLock none
ファイルに排他的な読み取りロックがある (つまり、ファイルが進行中または書き込み中ではない) 場合にのみファイルをポーリングするために、コンシューマーが使用します。Apache Camel は、ファイルロックが許可されるまで待機します。
readLock オプションは、以下の組み込みストラテジーをサポートします。
  • none は、読み取りロックはまったくありません。
  • changed は、長さ/変更のタイムスタンプを使用して、ファイルが現在コピーされているかどうかを検出します。これを判断するために少なくとも 1 秒待機します。したがって、このオプションはファイルを他のほど速く消費できませんが、JDK IO API はファイルが別のプロセスで現在使用されているかどうかを判断できないため、信頼性を高めることができます。readLockCheckInterval オプションを使用して、チェック頻度を設定できます。
  • markerFile Camel はマーカーファイル fileName.camelLock を作成し、その後にロックを保持します。このオプションは FTP コンポーネントでは使用できません。
  • fileLockjava.nio.channels.FileLock を使用します。マウント/共有を介してリモートファイルシステムにアクセスする場合は、そのファイルシステムが分散ファイルロックをサポートしている場合を除き、このアプローチは回避する必要があります。
  • rename は、排他的な読み取りロックを取得できる場合は、テストとしてファイルの名前変更を試みるために使用します。
  • idempotent (Camel 2.16)は、idempotentRepository を読み取りロックとして使用するために使用します。これにより、べき等性リポジトリーの実装がサポートする場合に、クラスターリングをサポートする読み取りロックを使用できます。
注記: 外部プログラムがファイルを書き込む場合は、Red Hat は readLock オプションの代わりに doneFileName オプションを使用することを推奨します。
警告: 読み取りロックストラテジーのほとんどは、クラスターモードでの使用には適していません。つまり、同じディレクトリーで同じファイルを読み取ろうとしている複数のコンシューマーを含めることはできません。この場合、読み取りロックは確実に機能しません。Hazelcast コンポーネントから などのクラスター対応べき等リポジトリー実装を使用する場合、べき等読み取りロックは、クラスター化された信頼性をサポートします。
readLockTimeout 0 (FTP の場合は 2000) 読み取りロックでサポートされている場合、読み取りロックのオプションのタイムアウト(ミリ秒単位)。読み取りロックを許可できず、タイムアウトがトリガーされた場合、Apache Camel はファイルをスキップします。Apache Camel が次にポーリングすると、がファイルを再度試行します。この場合、読み取りロックが許可される可能性があります。現在、fileLockchanged、および rename がタイムアウトに対応します。
readLockCheckInterval 1000 (FTP の場合、5000) Camel 2.6: 読み取りロックでサポートされている場合、読み取りロックの間隔(ミリ秒単位)。この間隔は、読み取りロックを取得する試行間のスリープに使用されます。たとえば、changed 読み取りロックを使用する場合は、低速な書き込み に対応するために間隔を長く設定できます。デフォルトの 1 秒。プロデューサーによるファイルの書き込みが非常に遅い場合は 短すぎる 可能性があります。
readLockMinLength 1 Camel 2.10.1: このオプションは、readLock=changed にのみ適用されます。このオプションを使用すると、最小ファイルの長さを設定できます。デフォルトで Camel はファイルにデータが含まれていると想定するため、デフォルト値は 1 です。このオプションをゼロに設定すると、長さがゼロのファイルを使用できます。
readLockLoggingLevel WARN Camel 2.12: 読み取りロックを取得できなかったときに使用されるログレベル。デフォルトでは、WARN がログに記録されます。このレベルを変更できます。たとえば、ログを記録しないように OFF に設定できます。このオプションは、changed、fileLock、rename タイプの readLock にのみ適用されます。
readLockMarkerFile true
Camel 2.14: changed、rename、または exclusive 読み取りロックタイプでマーカーファイルを使用するかどうか。デフォルトでは、他のプロセスが同じファイルを取得するのを防ぐために、マーカーファイルも使用されます。このオプションを false に設定すると、この動作をオフにできます。たとえば、Camel アプリケーションによってマーカーファイルをファイルシステムに書き込みたくない場合などです。
readLockRemoveOnRollback true
Camel 2.16: このオプションは、readLock=idempotent にのみ適用されます。ファイル処理が失敗し、ロールバックが行われるときに、べき等性リポジトリーからファイル名エントリーを削除するかどうかを指定します。false の場合、ファイル名のエントリーが確認されます(ファイルがコミットしたかのように)。
readLockRemoveOnCommit false
Camel 2.16: このオプションは、readLock=idempotent にのみ適用されます。ファイル処理に成功し、コミットが行われるときに、べき等性リポジトリーからファイル名エントリーを削除するかどうかを指定します。デフォルトでは、エントリーは削除され ない ため、別のアクティブなノードがファイルを取得しようとすると競合状態が発生しなくなります。この場合、(競合状態のリスクが引き継がった後に) X 分後にファイル名エントリーがエビクトされるように、べき等リポジトリーでエビクションストラテジーを設定することが推奨されます。
readLockDeleteOrphanLockFiles true
Camel 2.16: このオプションは、readLock=markerFile にのみ適用されます。起動時に、孤立した読み取りロックファイルを削除するかどうかを指定します。このファイルは、Camel が適切にシャットダウンされなかった場合にファイルシステムに残っている可能性があります(JVM クラッシュ)。false の場合、孤立したロックファイルが Camel による対応するファイルの取得をブロックしなくなる可能性があります。
directoryMustExist
Camel 2.5: startingDirectoryMustExist と似ていますが、これは再帰的なサブディレクトリーのポーリングに適用されます。
doneFileName null Camel 2.6: 提供されている場合、Camel は 完了 ファイルが存在する場合にのみファイルを消費します。このオプションは、使用するファイル名を設定します。固定の名前を指定できます。または、動的プレースホルダーを使用することもできます。完了 ファイルは、常に元のファイルと同じフォルダーに 想定されます。例は、完了ファイルの使用と、実行ファイル の書き込みセクションを参照して ください。注記:外部プログラムがファイルを書き込む場合には、Red Hat は doneFileName オプションを使用することを推奨します。
exclusiveReadLockStrategy null org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy 実装としてのプラグ可能な読み取りロック。
maxMessagesPerPoll 0 ポーリングごとに収集するメッセージの最大数を定義する整数。デフォルトでは最大値は設定されていません。たとえば 1000 などの制限を設定して、サーバーが起動時に数千のファイルを読み込まないようにすることができます。無効にするには、0 または負の値を設定します。
eagerMaxMessagesPerPoll true
Camel 2.9.3: maxMessagesPerPoll の制限が Eager であるかどうかを制御できます。eager の場合、ファイルのスキャン中に制限されます。false の場合、すべてのファイルをスキャンし、並び替えを実行します。このオプションを false に設定すると、すべてのファイルを最初にソートしてからポーリングを制限できます。ソートのためにすべてのファイルの詳細がメモリー内にあるため、メモリー使用量が大きくなることに注意してください。
minDepth 0 Camel 2.8: ディレクトリーを再帰的に処理する際に処理を開始する最小深度。minDepth=1 は ベースディレクトリーを意味します。minDepth=2 は最初のサブディレクトリーを意味します。このオプションは FTP コンシューマーではサポートされて いません
maxDepth Integer.MAX_VALUE Camel 2.8: ディレクトリーを再帰的に処理する際にトラバースする最大深度。このオプションは FTP コンシューマーではサポートされて いません
processStrategy null プラグ可能な org.apache.camel.component.file.GenericFileProcessStrategy により、独自の readLock オプションまたは同様のものを実装できます。特別な 準備完了 ファイルが存在するなど、ファイルを使用する前に特別な条件を満たす必要がある場合にも使用できます。このオプションを設定すると、readLock オプションは適用されません。
startingDirectoryMustExist false 開始ディレクトリーの存在が必要かどうか。autoCreate オプションはデフォルトで有効になっていることに注意してください。つまり、開始ディレクトリーが存在しない場合は通常は自動作成されます。autoCreate を無効にし、これを有効にして開始ディレクトリーが存在する必要があることを確認できます。ディレクトリーが存在しない場合は例外が発生します。
pollStrategy null
プラグ可能な org.apache.camel.spi.PollingConsumerPollStrategy により、Exchange が作成され、Camel でルーティングされる前に、通常ポーリング操作中に発生するエラー処理を制御するカスタム実装を提供できます。つまり、ポーリングで情報を収集している間にエラーが発生したため、たとえばファイルネットワークへのアクセスに失敗し、Camel がこれにアクセスしてファイルをスキャンできません。デフォルトの実装は、WARN レベルで原因となった例外をログに記録し、無視します。
sendEmptyMessageWhenIdle false
Camel 2.9: ポーリングコンシューマーがファイルをポーリングしなかった場合は、このオプションを有効にして、代わりに空のメッセージ(ボディーなし)を送信できます。
consumer.bridgeErrorHandler false
Camel 2.10: コンシューマーを Camel ルーティングエラーハンドラーにブリッジングできるようにします。つまり、ファイルの取得を試みる際に発生した例外はメッセージとして処理され、ルーティングエラーハンドラーによって処理されます。デフォルトでは、コンシューマーは org.apache.camel.spi.ExceptionHandler を使用して例外に対応し、デフォルトでは WARN/ERROR レベルでログに記録され、無視されます。詳細は、How to use the Camel error handler to handling with exception triggered outside the routing engine を参照してください。
scheduledExecutorService null
Camel 2.10: コンシューマーに使用するカスタム/共有スレッドプールを設定できます。デフォルトでは、各コンシューマーに独自の単一スレッドのスレッドプールがあります。このオプションを使用すると、複数のファイルコンシューマー間でスレッドプールを共有できます。
scheduler null Camel 2.12: カスタムスケジューラーを使用して、コンシューマーの実行をトリガーします。詳細は コンシューマーの ポーリング を参照してくださいたとえば、CRON 式をサポートする Quartz2 および Springベースのスケジューラーがあります。
backoffMultiplier 0 Camel 2.12: 後続のアイドル状態/エラーが連続して発生した場合は、スケジュールされたポーリングコンシューマーのバックオフを解除します。乗数は、次の試行が行われる前にスキップされるポーリングの数になります。このオプションが設定されている場合は、backoffIdleThresholdbackoffErrorThreshold も設定する必要があります。詳細は、Polling Consumer を参照してください。
backoffIdleThreshold 0 Camel 2.12: backoffMultipler が開始する前に発生する必要のある後続のアイドルポーリングの数。
backoffErrorThreshold 0 Camel 2.12: backoffMultipler が開始する前に発生すべき後続のエラーポーリングの数(エラーにより失敗)。
onCompletionExceptionHandler Camel 2.16: カスタムの org.apache.camel.spi.ExceptionHandler を使用して、コンシューマーがコミットまたはロールバックを実行する完了プロセスのファイル中に発生する例外を処理します。デフォルトの実装は、WARN レベルですべての例外をログに記録し、無視します。
probeContentType false
Camel 2.17: コンテンツタイプのプローブを有効にするかどうか。有効にすると、コンシューマーは Files#probeContentType(java.nio.file.Path) を使用してファイルの Content-Type を判別し、キー Exchange#FILE_CONTENT_TYPE のヘッダーとしてメッセージに保存します。
注記: Camel 2.15 以降では、この関数が導入され、常に有効になっていました。しかし、Camel 2.17 以降、一部のファイルシステムで問題が発生する可能性があるため、デフォルトではオフになっています。
extendedAttributes null Camel 2.17: オプションの値に応じて Files.getAttribute(ava.nio.file.Path, java.lang.String attribute) または Files.readAttributes(ava.nio.file.Path, java.lang.String attributes) を使用して java.nio.file.attribute クラスで拡張ファイル属性の収集を有効にするには、以下を実行します。このオプションは、収集する属性のコンマ区切りリスト(例: basic:creationTime, posix:group-or a simple wildcard-or posix:* など)をサポートします。属性名の前には、基本属性が照会されます。結果は、CamelFileExtendedAttributes タイプのキー Map<String, Object> のヘッダーとして保存されます。キー は属性の名前(例: posix:group)で、Files.getAttribute() または ----------|----- への呼び出しによって返された属性になります。Files.readAttributes

ファイルコンシューマーのデフォルト動作

  • デフォルトでは、ファイルは処理期間中ロックされ ません
  • ルートが完了すると、ファイルは .camel サブディレクトリーに移動し、それらが削除されるように表示されます。
  • File Consumer は、.、.camel.m2 . groovy など、名前がドットで始まるファイルを常にスキップします。
  • includeNamePrefixincludeNamePostfixexcludeNamePrefixexcludeNamePostfix、およびregexPattern などのオプションが使用される場合、ファイル(ディレクトリーではない)のみが有効なファイル名に一致します。

プロデューサーのみ

Expand
名前 デフォルト値 説明
fileExist オーバーライド 同じ名前のファイルがすでに存在する場合のアクション。以下の値を指定できます: OverrideAppendFailIgnoreMove、および TryRename (Camel 2.11.1)。デフォルトの を 上書き し、既存のファイルを置き換えます。append は、既存のファイルにコンテンツを追加します。FailGenericFileOperationException を出力し、既存のファイルがあることを示します。ignore は問題をサイレントに無視し、既存のファイルは上書きし ません が、問題があるとします。Move オプションには Camel 2.10.1 以降が必要で、対応する moveExisting オプションも設定する必要があります。オプション eagerDeleteTargetFile を使用して、ファイルの移動と既存ファイルがすでに存在する場合の動作を制御できます。そうしないと、移動操作が失敗します。Move オプションは、ターゲットファイルを書き込む前に既存のファイルを移動します。TryRenameCamel 2.11.1 は、tempFileName オプションが使用されている場合にのみ適用されます。これにより、存在チェックを実行せずに、一時的なファイル名から実際のファイル名への変更を試みることができます。このチェックは、一部のファイルシステム、特に FTP サーバーでは高速になる場合があります。
tempPrefix null このオプションは、一時的な名前を使用してファイルを書き込み、書き込みが完了した後に、その名前を実際の名前に変更するために使用されます。書き込み中のファイルを識別し、(排他的読み取りロックを使用せずに) コンシューマーが進行中のファイルを読み取らないようにするために使用できます。大きなファイルをアップロードするときに FTP でよく使用されます。
tempFileName null Camel 2.1: tempPrefix オプションと 同じ ですが、File 言語を使用する一時的なファイル名の命名をより詳細に制御できます
keepLastModified false Camel 2.2: ソースファイル(存在する場合)から最後に変更されたタイムスタンプを保持します。Exchange.FILE_LAST_MODIFIED ヘッダーを使用してタイムスタンプを見つけます。このヘッダーには、java.util.Date またはタイムスタンプ付きの long を含めることができます。タイムスタンプが存在し、オプションが有効な場合は、書き込まれたファイルにこのタイムスタンプが設定されます。注記: このオプションは、ファイル プロデューサーにのみ適用されます。このオプションは、ftp プロデューサーでは使用 できません
eagerDeleteTargetFile true Camel 2.3: 既存のターゲットファイルを完全に削除するかどうか。このオプションは、fileExists=Override および tempFileName オプションも使用する場合にのみ適用されます。これを使用して、一時ファイルが書き込まれる前にターゲットファイルを削除することを無効化 (false に設定) できます。たとえば、大きなファイルを書き込んで、一時ファイルの書き込み中にターゲットファイルを存在させたい場合があります。これにより、一時ファイルの名前がターゲットファイル名に変更される直前まで、ターゲットファイルは削除されません。このオプションの Camel 2.10.1 から、fileExist=Move が有効で、既存のファイルが存在する場合に、既存のファイルを削除するかどうかを制御するためにも使用されます。オプション copyAndDeleteOnRenameFailfalse の場合、既存のファイルが存在する場合は例外が出力されます。true の場合、既存のファイルは移動操作の前に削除されます。
doneFileName null Camel 2.6: 指定された場合、元のファイルが書き込まれると、Camel は 2 番目の 完了 ファイルを書き込みます。完了 ファイルは空になります。このオプションは、使用するファイル名を設定します。固定の名前を指定できます。または、動的プレースホルダーを使用することもできます。完了 ファイルは、常に 元のファイルと同じフォルダーに書き込まれます。例は、writing done file セクションを参照してください。注記:外部プログラムがファイルを書き込む場合には、Red Hat は doneFileName オプションを使用することを推奨します。
allowNullBody false Camel 2.10.1: ファイルの書き込み中に null ボディーが許可されるかどうかを指定するために使用されます。true に設定すると空のファイルが作成され、false に設定して null の本文をファイルコンポーネントに送信しようとすると、Cannot write null body to file.という GenericFileWriteException が出力されます。fileExist オプションが Override に設定されている場合、ファイルは切り捨てられ、append に設定するとファイルは変更されません。
forceWrites true Camel 2.10.5/2.11: ファイルシステムへの書き込みを強制的に同期するかどうか。たとえばログや監査ログへの書き込みなど、このレベルの保証が必要ない場合はオフにすることでパフォーマンスが向上します。
chmod null Camel 2.15.0: プロデューサーによって送信されるファイルパーミッションを指定します。ここで、chmod の値は 000 から 777 の間でなければなりません。先頭の数字(例: 0755-are)は無視されます。
chmodDirectory null Camel 2.17.0: プロデューサーが不足しているディレクトリーを作成する場合に使用されるディレクトリーパーミッションを指定します。ここで、chmod の値は 000 から 777 の間でなければなりません。先頭の数字(例: 0755-are)は無視されます。

ファイルプロデューサーのデフォルト動作

  • デフォルトでは、同じ名前の既存ファイルが存在する場合は、既存のファイルを上書きします。Apache Camel 1.x では、Append がファイルプロデューサーのデフォルトです。これは java.io.File を使用したデフォルトのファイル操作であるため、Apache Camel 2.0 で Override に変更しました。また、camel-ftp コンポーネントで使用する FTP ライブラリーのデフォルトです。

移動および削除操作

移動または削除操作は、ルーティングが完了した後(コマンド後)で実行されます。したがって、エクスチェンジ の処理中に、ファイルは引き続き inbox フォルダーにあります。
以下に例を示します。
    from("file://inbox?move=.done").to("bean:handleOrder");
Copy to Clipboard Toggle word wrap
inbox フォルダーにファイルがドロップされると、ファイルコンシューマーはこれを通知し、handleOrder Bean にルーティングされる新しい FileExchange を作成します。その後、Bean は File オブジェクトを処理します。この時点で、ファイルは inbox フォルダーに残ります。Bean が完了し、ルートが完了すると、ファイルコンシューマーは move 操作を実行し、ファイルを .done サブフォルダーに移動します。
move オプションおよび preMove オプションはディレクトリー名とみなされます( File LanguageSimple などの式を使用する場合、式の評価の結果は使用されるファイル名になります)。たとえば、を設定すると、以下のようになります。
move=../backup/copy-of-${file:name}
Copy to Clipboard Toggle word wrap
次に、使用する File 言語 を使用して、使用するファイル名を返します。これは、relative または absolute のいずれかです。相対的な場合、ディレクトリーは、ファイルが消費されたフォルダー内からのサブフォルダーとして作成されます。
デフォルトでは、Apache Camel は、ファイルが消費されたディレクトリーとの関連で、消費されたファイルを .camel サブフォルダーに移動します。
処理後にファイルを削除する場合は、ルートは以下のようになります。
    from("file://inobox?delete=true").to("bean:handleOrder");
Copy to Clipboard Toggle word wrap
ファイルが処理される に移動する 事前 移動操作が導入されました。これにより、処理前にこのサブフォルダーに移動する際にスキャンされたファイルをマークできます。
    from("file://inbox?preMove=inprogress").to("bean:handleOrder");
Copy to Clipboard Toggle word wrap
pre move と通常の移動を組み合わせることができます。
    from("file://inbox?preMove=inprogress&move=.done").to("bean:handleOrder");
Copy to Clipboard Toggle word wrap
したがって、このような状況では、処理中および処理された後にファイルが 進行中 のフォルダーにある場合、このファイルは .done フォルダーに移動します。

移動および PreMove オプションの詳細な制御

move オプションおよび preMove オプションは Expression-based であるため、ディレクトリーおよび名前パターンの高度な設定を行うために File Language の全機能を使用できます。実際、Apache Camel は、入力したディレクトリー名を File Language 式に内部的に変換します。そのため、move=.done を入力すると、Apache Camel がこれを ${file:parent}/.done/${file:onlyname} に変換します。これは、Apache Camel がオプション値に ${ } を指定していないことを検知した場合にのみ行われます。そのため、${ } を含む式を入力すると、式は File Language 式として解釈されます。
したがって、パターンとして現在の日付を持つバックアップフォルダーにファイルを移動する場合は、以下を行うことができます。
move=backup/${date:now:yyyyMMdd}/${file:name}
Copy to Clipboard Toggle word wrap

moveFailed について

moveFailed オプションを使用すると、処理 できない ファイルを、選択したエラーフォルダーなどの別の場所に移動できます。たとえば、タイムスタンプ付きのエラーフォルダー内のファイルを移動するには、moveFailed=/error/${file:name.noext}-${date:now:yyyyMMddHHmmssSSS}.${file:name.ext} を使用できます。
その他の例については、File Language を参照してください。

メッセージヘッダー

このコンポーネントでは、以下のヘッダーがサポートされます。

ファイルプロデューサーのみ

Expand
ヘッダー 説明
CamelFileName 書き込むファイルの名前を指定します(エンドポイントディレクトリーへの相対パス)。名前は StringFile Language または Simple 式を持つ String、または Expression オブジェクトになります。null の場合、Apache Camel はメッセージ固有の ID に基づいてファイル名を自動生成します。
CamelFileNameProduced 書き込まれた出力ファイルの実際の絶対パス(パス + 名)。このヘッダーは Camel によって設定され、その目的は書き込まれたファイルの名前でエンドユーザーを提供します。
CamelOverruleFileName Camel 2.11: CamelFileName ヘッダーのオーバーラップに使用され、代わりに値を使用します(ただし、プロデューサーは ファイルの書き込み後にこのヘッダーを削除するため、1 回のみ)。値は String のみにすることができます。fileName オプションが設定されている場合、これは引き続き評価されていることに注意してください。

ファイルコンシューマーのみ

Expand
ヘッダー 説明
CamelFileName 消費されたファイルの名前(エンドポイントに設定された開始ディレクトリーからのオフセットを含む相対パス)。
CamelFileNameOnly ファイル名のみ (先行パスを含まない名前)。
CamelFileAbsolute 消費されたファイルが絶対パスを表すかどうかを指定する ブール値 オプション。通常、相対パスの場合は false である必要があります。絶対パスは通常使用しないでくださいが、ファイルを絶対パスに移動できるように move オプションに追加しました。ただし、他の場所でも使用することができます。
CamelFileAbsolutePath ファイルへの絶対パス。相対ファイルの場合、このパスは代わりに相対パスを保持します。
CamelFilePath ファイルパス。相対ファイルの場合、これは開始ディレクトリー + 相対ファイル名になります。絶対ファイルの場合、これは絶対パスです。
CamelFileRelativePath 相対パス。
CamelFileParent 親パス。
CamelFileLength ファイルサイズを含む long 値。
CamelFileLastModified ファイルの最終変更のタイムスタンプを含む long 値。

バッチコンシューマー

このコンポーネントは、バッチコンシューマー を 実装し ます。

エクスチェンジプロパティー、ファイルコンシューマーのみ

ファイルコンシューマーは BatchConsumer であるため、ポーリングするファイルのバッチ処理をサポートします。バッチ処理により、Apache Camel はいくつかのプロパティーを エクスチェンジ に追加し、現在のインデックスをポーリングしたファイルの数を把握します。
Expand
プロパティー 説明
CamelBatchSize このバッチでポーリングされたファイルの合計数。
CamelBatchIndex バッチの現在のインデックス。0 から始まります。
CamelBatchComplete バッチの最後の エクスチェンジ を示す ブール 値。最後のエントリーに対してのみ true になります。
これにより、たとえば、このバッチに存在するファイルの数を把握し、Aggregator はこの数のファイルを集約できます。

フォルダーおよびファイル名を使用した一般的な gotchas

Apache Camel がファイルを生成する場合(ファイルの書き込み)、選択したファイル名の設定方法に影響を及ぼします。デフォルトでは、Apache Camel はメッセージ ID をファイル名として使用し、メッセージ ID は通常一意の生成された ID であるため、ID-MACHINENAME-2443-1211718892437-1-0 などのファイル名になります。このようなファイル名が必要ない場合は、CamelFileName メッセージヘッダーにファイル名を指定する必要があります。定数 Exchange.FILE_NAME も使用できます。
以下のサンプルコードは、メッセージ ID をファイル名として使用してファイルを作成します。
from("direct:report").to("file:target/reports");
Copy to Clipboard Toggle word wrap
report.txt をファイル名として使用するには、以下を実行します。
from("direct:report").setHeader(Exchange.FILE_NAME, constant("report.txt")).to( "file:target/reports");
Copy to Clipboard Toggle word wrap
または上記と同じですが、CamelFileName の場合:
from("direct:report").setHeader("CamelFileName", constant("report.txt")).to( "file:target/reports");
Copy to Clipboard Toggle word wrap
fileName URI オプションを使用してエンドポイントにファイル名を設定する構文。
from("direct:report").to("file:target/reports/?fileName=report.txt");
Copy to Clipboard Toggle word wrap

ファイル名式

ファイル名は、expression オプションを使用するか、CamelFileName ヘッダーの文字列ベースの File Language 式のいずれかを使用して設定できます。構文およびサンプルについては、File Language を参照してください。

他のファイルを直接ドロップするフォルダーからのファイルの使用

他のアプリケーションがファイルを直接書き込むフォルダーからファイルを消費する場合は注意してください。さまざまな readLock オプションを見て、ユースケースに適したものを確認します。ただし、最善の方法は、別のフォルダーに書き込み、書き込み後にドロップフォルダーにファイルを移動することです。ただし、ドロップフォルダーに直接ファイルを書き込むと、ファイルが 変更 されたアルゴリズムを使用して、ファイルのサイズや変更が一定期間変更されるかどうかを確認するため、変更されたファイルが現在書き込みまたはコピーされているかどうかをより適切に検出できます。他の読み取りロックオプションは、これを検出するときに必ずしも適切ではない Java File API に依存します。また、doneFileName オプションも確認します。これは、ファイルが完了して使用できるときにマーカーファイル(done)を使用してシグナルを送ります。

完了ファイルの使用

Camel 2.6 以降で利用可能
また、以下の 実行ファイルの書き込み のセクション を参照してください。
完了ファイルが存在する場合にのみファイルを消費する場合は、エンドポイントで doneFileName オプションを使用できます。
from("file:bar?doneFileName=done");
Copy to Clipboard Toggle word wrap
ターゲットファイルと同じディレクトリーにファイル名が存在する場合にのみ、bar フォルダーからファイルを消費します。Camel は、ファイルの使用が完了すると、完了ファイルを自動的に削除します。
ただし、ターゲットファイルごとに 1 つのファイルを配置するのが一般的です。これは、相関が 1:1 であることを意味します。これを実行するには、doneFileName オプションで動的プレースホルダーを使用する必要があります。現在、Camel は、file:name および file:name.noext の 2 つの動的トークンをサポートします。 これは ${ } で囲む必要があります。コンシューマーは、接頭辞または接尾辞(両方ではない)として実行されたファイル名の静的部分のみをサポートします。
from("file:bar?doneFileName=${file:name}.done");
Copy to Clipboard Toggle word wrap
この例では、ファイル名が .done の完了したファイルが存在する場合にのみポーリングされます。以下に例を示します。
  • hello.txt - 消費されるファイルです。
  • hello.txt.done - 関連する完了ファイルです。
以下のように、完了ファイルの接頭辞を使用することもできます。
from("file:bar?doneFileName=ready-${file:name}");
Copy to Clipboard Toggle word wrap
  • hello.txt - 消費されるファイルです。
  • ready-hello.txt - 関連する完了ファイルです。

行われたファイルの作成

Camel 2.6 以降で利用可能
af ファイルを書き込んだ後は、ファイルが 完了 して書き込まれたことを他の人に示すために、追加の完了ファイルをマーカーとして書き出すことができます。これには、ファイルプロデューサーエンドポイントで doneFileName オプションを使用できます。
.to("file:bar?doneFileName=done");
Copy to Clipboard Toggle word wrap
は単に、target ファイルと同じディレクトリーに done という名前のファイルを作成します。
ただし、ターゲットファイルごとに 1 つのファイルを配置するのが一般的です。これは、相関が 1:1 であることを意味します。これを実行するには、doneFileName オプションで動的プレースホルダーを使用する必要があります。現在 Camel は、file:name および file:name.noext の 2 つの動的トークンをサポートします。 これは、${ } で囲む必要があります。
.to("file:bar?doneFileName=done-${file:name}");
Copy to Clipboard Toggle word wrap
たとえば、ターゲットファイルがターゲットファイルと同じディレクトリーに foo.txt の場合は、done-foo.txt という名前のファイルを作成します。
.to("file:bar?doneFileName=${file:name}.done");
Copy to Clipboard Toggle word wrap
たとえば、ターゲットファイルがターゲットファイルと同じディレクトリーに foo.txt.done であった場合、foo.txt.done という名前のファイルを作成します。
.to("file:bar?doneFileName=${file:name.noext}.done");
Copy to Clipboard Toggle word wrap
たとえば、ターゲットファイルが foo.txt の場合に、ターゲットファイルと同じディレクトリーに foo.done という名前のファイルを作成します。

ディレクトリーから読み取り、別のディレクトリーに書き込みます。

from("file://inputdir/?delete=true").to("file://outputdir")
Copy to Clipboard Toggle word wrap
from("file://inputdir/?delete=true").to("file://outputdir?overruleFile=copy-of-${file:name}")
Copy to Clipboard Toggle word wrap
ディレクトリーでリッスンし、そこにドロップされる各ファイルのメッセージを作成します。コンテンツを outputdir にコピーし、inputdir のファイルを削除します。

ディレクトリーから再帰的に読み取り、別のディレクトリーへの書き込み

from("file://inputdir/?recursive=true&delete=true").to("file://outputdir")
Copy to Clipboard Toggle word wrap
ディレクトリーでリッスンし、そこにドロップされる各ファイルのメッセージを作成します。コンテンツを outputdir にコピーし、inputdir のファイルを削除します。はサブディレクトリーに再帰的にスキャンします。は、サブディレクトリーを含む inputdir と同じディレクトリー構造のファイルを outputdir に配置します。
inputdir/foo.txt
inputdir/sub/bar.txt
Copy to Clipboard Toggle word wrap
以下の出力レイアウトが生成されます。
outputdir/foo.txt
outputdir/sub/bar.txt
Copy to Clipboard Toggle word wrap

フラット化の使用

ファイルを同じディレクトリーの outputdir ディレクトリーに保存する場合は、ソースディレクトリーのレイアウトを無視する(たとえば、パスをフラット化するなど)、ファイルプロデューサー側で flatten=true オプションを追加するだけです。
from("file://inputdir/?recursive=true&delete=true").to("file://outputdir?flatten=true")
Copy to Clipboard Toggle word wrap
以下の出力レイアウトが生成されます。
outputdir/foo.txt
outputdir/bar.txt
Copy to Clipboard Toggle word wrap

ディレクトリーおよびデフォルトの移動操作からの読み取り

Apache Camel はデフォルトで、処理されたファイルを、ファイルが消費されたディレクトリー内の .camel サブディレクトリーに移動します。
from("file://inputdir/?recursive=true&delete=true").to("file://outputdir")
Copy to Clipboard Toggle word wrap
は、以前と同様にレイアウト 影響します。
inputdir/foo.txt
inputdir/sub/bar.txt
Copy to Clipboard Toggle word wrap
after
inputdir/.camel/foo.txt
inputdir/sub/.camel/bar.txt
outputdir/foo.txt
outputdir/sub/bar.txt
Copy to Clipboard Toggle word wrap

ディレクトリーから読み取り、java でメッセージを処理します。

from("file://inputdir/").process(new Processor() {
  public void process(Exchange exchange) throws Exception {
    Object body = exchange.getIn().getBody();
    // do some business logic with the input body
  }
});
Copy to Clipboard Toggle word wrap
ボディーは、inputdir ディレクトリーにドロップされたばかりのファイルを参照する File オブジェクトです。

ディレクトリーからファイルを読み込み、内容を jms キューに送信します。

from("file://inputdir/").convertBodyTo(String.class).to("jms:test.queue")
Copy to Clipboard Toggle word wrap
デフォルトでは、File エンドポイントは File オブジェクトが含まれる FileMessage をボディーとして送信します。これを JMS コンポーネントに直接送信すると、JMS メッセージには File オブジェクトのみが含まれますが、コンテンツは含まれません。FileString に変換することで、メッセージにはファイルの内容(おそらく必要なもの)が含まれます。
Spring DSL を使用した上記のルート:
   <route>
      <from uri="file://inputdir/"/>
      <convertBodyTo type="java.lang.String"/>
      <to uri="jms:test.queue"/>
   </route>
Copy to Clipboard Toggle word wrap

ファイルへの書き込み

Apache Camel は当然ながらファイルを書き込むこともできます。つまり、ファイルが生成されます。以下の例では、ディレクトリーに書き込まれる前に処理する SEDA キューに関するレポートの一部を受け取ります。
public void testToFile() throws Exception {
    MockEndpoint mock = getMockEndpoint("mock:result");
    mock.expectedMessageCount(1);
    mock.expectedFileExists("target/test-reports/report.txt");

    template.sendBody("direct:reports", "This is a great report");

    assertMockEndpointsSatisfied();
}

protected JndiRegistry createRegistry() throws Exception {
    // bind our processor in the registry with the given id
    JndiRegistry reg = super.createRegistry();
    reg.bind("processReport", new ProcessReport());
    return reg;
}

protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        public void configure() throws Exception {
            // the reports from the seda queue is processed by our processor
            // before they are written to files in the target/reports directory
            from("direct:reports").processRef("processReport").to("file://target/test-reports", "mock:result");
        }
    };
}

private static class ProcessReport implements Processor {

    public void process(Exchange exchange) throws Exception {
        String body = exchange.getIn().getBody(String.class);
        // do some business logic here

        // set the output to the file
        exchange.getOut().setBody(body);

        // set the output filename using java code logic, notice that this is done by setting
        // a special header property of the out exchange
        exchange.getOut().setHeader(Exchange.FILE_NAME, "report.txt");
    }

}
Copy to Clipboard Toggle word wrap

Exchange.FILE_NAME を使用してサブディレクトリーに書き込みます。

単一ルートを使用すると、任意の数のサブディレクトリーにファイルを書き込むことができます。以下のようなルート設定がある場合:
  <route>
    <from uri="bean:myBean"/>
    <to uri="file:/rootDirectory"/>
  </route>
Copy to Clipboard Toggle word wrap
myBean をヘッダー Exchange.FILE_NAME を以下のような値に設定できます。
Exchange.FILE_NAME = hello.txt => /rootDirectory/hello.txt
Exchange.FILE_NAME = foo/bye.txt => /rootDirectory/foo/bye.txt
Copy to Clipboard Toggle word wrap
これにより、1 つのルートを使用してファイルを複数の宛先に書き込むことができます。

一時ディレクトリーを使用した最終的な宛先へのファイルの書き込み

時折、宛先ディレクトリーに関連する一部のディレクトリーにファイルを一時的に書き込む必要があります。このような状況は、通常、書き込み先のディレクトリーから一部のフィルター機能を持つ外部プロセスを読み取ると発生します。以下のファイルの例では、/var/myapp/filesInProgress ディレクトリーに書き込まれ、データ転送が完了すると、アトミックで /var/myapp/finalDirectory ディレクトリーに移動します。
from("direct:start").
  to("file:///var/myapp/finalDirectory?tempPrefix=/../filesInProgress/");
Copy to Clipboard Toggle word wrap

ファイル名の式の使用

この例では、現在の日付をサブフォルダー名として使用して、消費したファイルをバックアップフォルダーに移動します。
from("file://inbox?move=backup/${date:now:yyyyMMdd}/${file:name}").to("...");
Copy to Clipboard Toggle word wrap
その他のサンプルについては、File Language を参照してください。

同じファイルを複数回読み取るのを回避(べき等コンシューマー)

Apache Camel はコンポーネント内 で直接べき等コンシューマー をサポートするため、すでに処理されたファイルを省略します。この機能は、idempotent=true オプションを設定することで有効にできます。
from("file://inbox?idempotent=true").to("...");
Copy to Clipboard Toggle word wrap
Camel は絶対ファイル名をべき等キーとして使用し、重複ファイルを検出します。Camel 2.11 以降では、IdempotentKey オプションの式を使用してこのキーをカスタマイズできます。たとえば、名前とファイルサイズの両方をキーとして使用するには、以下を実行します。
  <route>
    <from uri="file://inbox?idempotent=true&dempotentKey=${file:name}-${file:size}"/>
    <to uri="bean:processInbox"/>
  </route>
Copy to Clipboard Toggle word wrap
デフォルトでは、Apache Camel は消費されたファイルを追跡するためにインメモリーベースのストアを使用し、最大 1000 エントリーを保持する最も最近使用されたキャッシュを使用します。指定された ID を持つレジストリー内の Bean の参照を示すために、値に # 記号を使用して、このストアの独自の実装をプラグインでき ます
   <!-- define our store as a plain spring bean -->
   <bean id="myStore" class="com.mycompany.MyIdempotentStore"/>

  <route>
    <from uri="file://inbox?idempotent=true&dempotentRepository=#myStore"/>
    <to uri="bean:processInbox"/>
  </route>
Copy to Clipboard Toggle word wrap
Apache Camel は、以前に使用されたためファイルをスキップすると DEBUG レベルでログを記録します。
DEBUG FileConsumer is idempotent and the file has been consumed before. Will skip this file: target\idempotent\report.txt
Copy to Clipboard Toggle word wrap

ファイルベースのべき等リポジトリーの使用

このセクションでは、デフォルトとして使用されるメモリー内ベースではなく、ファイルベースのべき等リポジトリー org.apache.camel.processor.idempotent.FileIdempotentRepository を使用します。このリポジトリーは、ファイルリポジトリーを読み取らないために 1 つのレベルキャッシュを使用します。これは、file リポジトリーを使用して 1 レベルのキャッシュの内容を保存します。これにより、リポジトリーはサーバーの再起動後も維持されます。これは、起動時にファイルの内容を 1 レベルのキャッシュに読み込みます。ファイル構造は、キーを ファイルの別々の行に保存するため、非常に簡単です。デフォルトでは、ファイルストアのサイズ制限は 1mb で、ファイルが大きくなると、Apache Camel はファイルストアを切り捨て、1 番目のレベルのキャッシュを新しい空のファイルにフラッシュしてコンテンツを再ビルドします。
Spring XML を使用してファイルべき等リポジトリーを作成し、\# 記号を使用して idempotentRepository でリポジトリーを使用するようにファイルコンシューマーを定義し、レジストリー検索を示します。
<!-- this is our file based idempotent store configured to use the .filestore.dat as file -->
<bean id="fileStore" class="org.apache.camel.processor.idempotent.FileIdempotentRepository">
    <!-- the filename for the store -->
    <property name="fileStore" value="target/fileidempotent/.filestore.dat"/>
    <!-- the max filesize in bytes for the file. Apache Camel will trunk and flush the cache
         if the file gets bigger -->
    <property name="maxFileStoreSize" value="512000"/>
    <!-- the number of elements in our store -->
    <property name="cacheSize" value="250"/>
</bean>

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="file://target/fileidempotent/?idempotent=true&dempotentRepository=#fileStore&ove=done/${file:name}"/>
        <to uri="mock:result"/>
    </route>
</camelContext>
Copy to Clipboard Toggle word wrap

JPA ベースのべき等リポジトリーの使用

このセクションでは、デフォルトとして使用されるインメモリーベースの代わりに、JPA ベースのべき等リポジトリーを使用します。
最初に、org.apache.camel.processor.idempotent.jpa.MessageProcessed クラスをモデルとして使用する必要がある META-INF/persistence.xml に persistence-unit が必要です。
<persistence-unit name="idempotentDb" transaction-type="RESOURCE_LOCAL">
  <class>org.apache.camel.processor.idempotent.jpa.MessageProcessed</class>

  <properties>
    <property name="openjpa.ConnectionURL" value="jdbc:derby:target/idempotentTest;create=true"/>
    <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
    <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>
    <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
  </properties>
</persistence-unit>
Copy to Clipboard Toggle word wrap
次に、Spring XML ファイルで Spring jpaTemplate を設定する必要があります。
<!-- this is standard spring JPA configuration -->
<bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <!-- we use idempotentDB as the persitence unit name defined in the persistence.xml file -->
    <property name="persistenceUnitName" value="idempotentDb"/>
</bean>
Copy to Clipboard Toggle word wrap
最後に、Spring XML ファイルで JPA idempotent リポジトリーを作成することもできます。
<!-- we define our jpa based idempotent repository we want to use in the file consumer -->
<bean id="jpaStore" class="org.apache.camel.processor.idempotent.jpa.JpaMessageIdRepository">
    <!-- Here we refer to the spring jpaTemplate -->
    <constructor-arg index="0" ref="jpaTemplate"/>
    <!-- This 2nd parameter is the name  (= a cateogry name).
         You can have different repositories with different names -->
    <constructor-arg index="1" value="FileConsumer"/>
</bean>
Copy to Clipboard Toggle word wrap
次に、idempotentRepository オプションと # 構文を使用して、ファイルコンシューマーエンドポイントで jpaStore Bean のみを参照する必要があります。
  <route>
    <from uri="file://inbox?idempotent=true&dempotentRepository=#jpaStore"/>
    <to uri="bean:processInbox"/>
  </route>
Copy to Clipboard Toggle word wrap

org.apache.camel.component.file.GenericFileFilter を使用するフィルター

Apache Camel はプラグ可能なフィルターリングストラテジーをサポートします。その後、このようなフィルターでエンドポイントを設定し、処理中の特定のファイルを省略できます。
この例では、ファイル名の skip で始まるファイルを スキップ する独自のフィルターを構築します。
public class MyFileFilter implements GenericFileFilter {
    public boolean accept(GenericFile pathname) {
        // we dont accept any files starting with skip in the name
        return !pathname.getFileName().startsWith("skip");
    }
}
Copy to Clipboard Toggle word wrap
次に、filter 属性を使用して、Spring XML ファイルで定義したフィルター( # 表記を使用)を参照するルートを設定できます。
   <!-- define our filter as a plain spring bean -->
   <bean id="myFilter" class="com.mycompany.MyFileFilter"/>

  <route>
    <from uri="file://inbox?filter=#myFilter"/>
    <to uri="bean:processInbox"/>
  </route>
Copy to Clipboard Toggle word wrap

ANT パスマッチャーを使用したフィルターリング

ANT パスマッチャーは、camel-spring jar で追加設定なしで提供されます。そのため、Maven を使用している場合は camel-spring に依存する必要があります。理由は、Spring の AntPathMatcher を使用して実際のマッチングを行うことです。
ファイルパスは、以下のルールと一致します。
  • ? 1 文字に一致します。
  • * ゼロ以上の文字に一致します。
  • ** パス内の 0 個以上のディレクトリーに一致します。
以下の例は、その使用方法を示しています。
<camelContext xmlns="http://camel.apache.org/schema/spring">
    <template id="camelTemplate"/>

    <!-- use myFilter as filter to allow setting ANT paths for which files to scan for -->
    <endpoint id="myFileEndpoint" uri="file://target/antpathmatcher?recursive=true&ilter=#myAntFilter"/>

    <route>
        <from ref="myFileEndpoint"/>
        <to uri="mock:result"/>
    </route>
</camelContext>

<!-- we use the antpath file filter to use ant paths for includes and exlucde -->
<bean id="myAntFilter" class="org.apache.camel.component.file.AntPathMatcherGenericFileFilter">
    <!-- include and file in the subfolder that has day in the name -->
    <property name="includes" value="**/subfolder/**/*day*"/>
    <!-- exclude all files with bad in name or .xml files. Use comma to seperate multiple excludes -->
    <property name="excludes" value="**/*bad*,**/*.xml"/>
</bean>
Copy to Clipboard Toggle word wrap

Comparator を使用したソート

Apache Camel はプラグ可能なソートストラテジーをサポートします。Java の java.util.Comparator でビルドを使用するこのストラテジーです。その後、このようなコンパレーターでエンドポイントを設定し、Apache Camel でファイルをソートしてから処理できます。
この例では、ファイル名でソートする独自のコンパレーターを構築します。
public class MyFileSorter implements Comparator<GenericFile> {
    public int compare(GenericFile o1, GenericFile o2) {
        return o1.getFileName().compareToIgnoreCase(o2.getFileName());
    }
}
Copy to Clipboard Toggle word wrap
次に、sorter オプションを使用してルートを設定し、Spring XML ファイルで定義したソーター(mySorter)を参照できます。
   <!-- define our sorter as a plain spring bean -->
   <bean id="mySorter" class="com.mycompany.MyFileSorter"/>

  <route>
    <from uri="file://inbox?sorter=#mySorter"/>
    <to uri="bean:processInbox"/>
  </route>
Copy to Clipboard Toggle word wrap
URI オプションは # 構文を使用して Bean を参照できます。
Spring DSL ルートでは、id の前に # を付けることで、レジストリー 内の Bean を参照できます。そのため、sorter=#mySorter を記述すると、Apache Camel に対して ID mySorter の Bean の Bean を検索するよう指示されます。

sortBy を使用したソート

Apache Camel はプラグ可能なソートストラテジーをサポートします。このストラテジーでは、File 言語 を使用してソートを設定します。sortBy オプションは以下のように設定されます。
sortBy=group 1;group 2;group 3;...
Copy to Clipboard Toggle word wrap
各グループはセミコロンで区切ります。簡単な状況では、1 つのグループのみを使用するので、簡単な例を以下に示します。
sortBy=file:name
Copy to Clipboard Toggle word wrap
ファイル名でソートされ、グループの前に reverse: を付けることで順序を元に戻すことができるため、ソートは Z..A になります。
sortBy=reverse:file:name
Copy to Clipboard Toggle word wrap
File Language の完全なパワーがあるので、他のいくつかのパラメーターを使用できるので、ファイルサイズでソートしたい場合は以下を行います。
sortBy=file:length
Copy to Clipboard Toggle word wrap
文字列比較には ignoreCase: を使用してケースを無視するように設定できます。したがって、ファイル名のソートを使用し、ケースを無視する場合は、以下を行います。
sortBy=ignoreCase:file:name
Copy to Clipboard Toggle word wrap
ignore case と reverse を組み合わせることができますが、最初に逆を指定する必要があります。
sortBy=reverse:ignoreCase:file:name
Copy to Clipboard Toggle word wrap
以下の例では、最後に変更されたファイルで、以下を行います。
sortBy=file:modified
Copy to Clipboard Toggle word wrap
次に、2 番目のオプションとして名前でグループ化するため、同じ変更を持つファイルを名前でソートします。
sortBy=file:modified;file:name
Copy to Clipboard Toggle word wrap
ここで問題が存在しますが、これを見つけることができますか ?ファイルの変更されたタイムスタンプはミリ秒単位であるため問題になりすぎますが、日付のみで、その後にサブグループを名前でソートしたい場合はどうすればよいですか ?また、ファイル言語の本当の力が あれば、パターンをサポートする date コマンドを使用できます。そのため、以下のように解決できます。
sortBy=date:file:yyyyMMdd;file:name
Copy to Clipboard Toggle word wrap
Yeah は非常に強力で、グループごとに reverse を使用することもできます。そのため、ファイル名を元に戻すことができます。
sortBy=date:file:yyyyMMdd;reverse:file:name
Copy to Clipboard Toggle word wrap

GenericFileProcessStrategy の使用

processStrategy オプションは、カスタムの GenericFileProcessStrategy を使用できます。これにより、独自の 開始コミット、および ロールバック ロジックを実装できます。たとえば、システムが使用するフォルダーにファイルを書き込むことを前提とします。ただし、別の 準備完了 ファイルも書き込まれる前に、このファイルの使用を開始することはできません。
そのため、独自の GenericFileProcessStrategy を実装することで、以下のように実装できます。
  • begin () メソッドでは、特別な 準備 済みファイルが存在するかどうかをテストできます。begin メソッドは ブール値 を返し、ファイルを使用できるかどうかを示します。
  • commit () メソッドでは、実際のファイルを移動し、準備完了 ファイルを削除することもできます。
使用における重要 consumer.bridgeErrorHandler
consumer.bridgeErrorHandler を使用する場合、インターセプターOnCompletion は適用さ れませんExchange は Camel Error Handler によって直接処理され、インターセプターなどの以前のアクションがCompletion のアクションを実行することを許可しません。

デバッグロギング

このコンポーネントにはログレベル TRACE があり、問題がある場合に役立ちます。
以下も参照してください。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat