WebSphere® Message Broker は、ファイルへのアクセスを制御し、一度に 1 つのファイル・ノードだけがファイルに対する読み取りと書き込みを行えるようにします。
メッセージ・フローが FileInput ノードまたは FileOutput ノードを使用すると、そのメッセージ・フローにインスタンス (スレッド) が追加で関連付けられたり、同じ実行グループ (または異なる実行グループ) の他のメッセージ・フローのファイル・ノードが、同じディレクトリーにあるファイルを参照したりすることがあります。 WebSphere Message Broker は、ファイルを処理中に mqsitransitin ディレクトリーに移動して、それらを処理中にロックすることにより、複数のプロセスがファイルに対して読み取りおよび書き込みを行う方法を制御します。 mqsitransitin ディレクトリーは、FileInput ノードで指定された入力ディレクトリーのサブディレクトリーです。
FileInput ノードを使用していて、サブディレクトリーを含める場合は、ファイルを処理する必要のあるすべての場所で必要に応じて mqsitransitin ディレクトリーが作成されます。
FileInput ノードがファイルを読み取るとき、最初にファイルは mqsitransitin ディレクトリーに移動されて、処理中にそこで保留にされます。 接頭部 (実行グループの UUID を含む) がファイル名に追加されて、どの実行グループがファイルを処理しているかが示されます。 ファイルがこのディレクトリーにある間、他の実行グループはそのファイルにアクセスできません。 ブローカーは mqsitransitin ディレクトリー内の lock サブディレクトリーを保守して、入力ディレクトリー内のファイルが一度に 1 つの実行グループによってのみアクセスされるようにします。
実行グループ内の複数のメッセージ・フローまたはインスタンスが同じ入力ディレクトリーから読み取る場合、1 つのメッセージ・フロー中の 1 つのインスタンスのみが、その読み取りに割り振られます。 ファイル内の各レコードは、このインスタンスによって逐次処理されます。 メッセージ・フローのその他のインスタンスまたはその他のメッセージ・フローは、ノードの「ファイル名またはパターン」プロパティーに指定されているパターンに一致する名前を持つ他のファイルを同時に処理することができます。
ファイルの処理中は、ファイル・システムが使用されて、そのファイルがロックされます。 結果として、他のプログラム (他の実行グループも含む) は、ファイル・ノードで処理中のファイルの読み取り、書き込み、または削除を行えなくなります。
FileInput ノードでのファイルの読み取り中は、そのファイルは、処理が完全に完了するまで (またはリカバリー不能エラーが発生するまで)、mqsitransitin ディレクトリー内にとどまります。 ファイルを保持する場合は、mqsitransitin ディレクトリーのサブディレクトリー内に保存されます。
ファイルが処理されると、それは mqsitransitin ディレクトリーから入力ディレクトリーに戻されます。 しかし、ファイルが mqsitransitin ディレクトリー内にあるときに、実行グループが予期せずに停止した場合は、実行グループの UUID 接頭部をファイル名から除去してからそれを入力ディレクトリーに移動することにより、入力ファイルを入力ディレクトリーに手動で復元できます。 その後、入力ファイルは、ディレクトリーをスキャンする次の FileInput ノードによって処理されます。
NFS サーバーを使用しており、異なる実行グループに属する複数のファイル・ノードから NFS サーバー上の同じディレクトリーにアクセスする場合は、ファイルのロックが適切にサポートされている NFS バージョン 4 を使用していることを確認してください。
FileOutput ノードによって作成されて書き込まれるファイルは、その処理が完了すると、出力ディレクトリーに入れられます。 レコードは、ファイルに追加される一方で、mqsitransit サブディレクトリーにも保持されます。
各レコードは、1 つのメッセージ・フロー・インスタンスによって書き込まれます。 特定のファイルにレコードを書き込むように構成されたすべてのメッセージ・フロー・インスタンスが、そのファイルにレコードを追加することができます。 インスタンスは任意の順序で実行できるので、インスタンスが書き込んだレコードは、インターリーブド状態になることがあります。 つまり、レコードの順序が変更されることがあります。 出力ファイル内のレコード・シーケンスを維持する必要がある場合、1 つの FileOutput ノード・インスタンスのみがそのファイルを使用するようにしてください。 1 つの FileOutput ノード・インスタンスだけがファイルを使用するようにするには、そのノードを含むメッセージ・フローを構成して、ゼロ個のインスタンスを持つ追加のインスタンス・プールをそのメッセージ・フローが使用するようにして、他のフローが同じファイルへの書き込みを行わないようにします。
ファイルの処理中は、ファイル・システムが使用されて、そのファイルがロックされます。 結果として、他のプログラム (他の実行グループも含む) は、ファイル・ノードで処理中のファイルの読み取り、書き込み、または削除を行えなくなります。 このロックが維持されるのは、FileOutput ノードがファイルへの書き込みを終了しないで、一時ディレクトリー内にそのファイルを放置した後の短期間です。 同じ実行グループ内のメッセージ・フローが、同じ出力ファイルを使用して、妥当な早さで処理を実行すれば、ブローカーはファイル処理の終了前にロックを解放しません。 ただし、メッセージ・フローの実行から次の実行までのインターバルが長くなると、ブローカーはロックを解放するので、別のプロセスまたは実行グループが、そのファイルに対するロックを獲得できるようになります。 このような状態を招かないために、実行グループ間で出力ディレクトリーが共有されないようにしてください。