5

私は、Dazzle と呼ばれる USPS 配送パッケージと連動するシステムを開発しています。このシステムの一部には、タブ区切りの値ファイルを取得し、それらを Dazzle が認識する XML に変換し、ラベル生成のために Dazzle に渡すことを目的とする監視デーモンが含まれています。そして、この部分はうまく機能します。ただし、私がやりたいことは、Dazzle が生成する出力ファイルを解析してデータベースにインポートすることです。

ここで、Dazzle は Windows 上で動作することに注意してください。私の監視デーモンは Perl で書かれており、Linux で動作します。私の Linux システムには、Samba 経由でマウントされた Dazzle の入力および出力ディレクトリがあります。

Dazzle が出力ファイルの書き込みを開始してから完了するまでには、かなりの遅延があります。私が知りたいのは、Dazzle が出力ファイルの書き込みを完了するのをどのように待つことができるかということです。ファイルを開いて実行しようとしましflock($fh, LOCK_SH)たが、うまくいかなかったようです。

編集:以下の「mobrule」のコメントに基づいたアイデアがあります。Dazzle は出力ファイルを XML で書き込みます。出荷の各パッケージはタグで囲まれ、ドキュメント全体がタグで囲まれています。そのため、ファイルが完了する前に読み取りを開始した場合は、適切な終了タグが表示されるのを待ってからアクションを実行できます。

また、私が現在行っていることについても言及する必要があります。出力 XML ファイルが作成されたことを検出すると、それを解析しようとします。その解析が失敗した場合は、スリープして再試行します。それが失敗した場合、私は 2 倍長く寝てから、もう一度やり直します。これは、64 秒のタイムアウトでのテストでかなりうまく機能しました。

4

4 に答える 4

5

あるプロセスが任意のファイルへの開いているファイルハンドルを持っているかどうかを知る一般的で移植可能な方法はありません。状況に関する現地の知識に基づいて判断を下す必要があります。

この場合、Windows マシンのプロセス テーブルにクエリを実行して、「Dazzle」プログラムがまだ実行されているかどうかを確認できる場合があります。または、「入力が適切な場合、Dazzle の実行に 20 秒以上かかることはありません」または「Dazzle の実行中は、数秒ごとにファイルを更新します。ファイルが更新されていない場合、たとえば 10 秒で、ダズルが終了する可能性が非常に高くなります。」

ただし、必ずしも Dazzle が終了するまで待つ必要はありません。Dazzle がファイルに書き込んでいるのと同時にファイルを読み込んでもまったく問題ありません。関数については perldoc をseek参照し、 「エミュレートする方法」の部分に注意してくださいtail -f。その後、Dazzle の実行中にデータベースを更新できます。

このように、Dazzle がいつ終了するかを推測するのが保守的すぎる場合でも、データベースはタイムリーに更新され、唯一のコストは EOF でのファイルハンドルに対する無駄なシークと読み取りの呼び出しです。

于 2010-02-25T16:12:27.893 に答える
1

LOCK_EX を使用してロックを実行してみてください。ロックに失敗した場合は、まだ書き込み中であることを意味します。ロックを取得するまでそのようにスピンし、ダズルを行う必要があります。これは、Dazzle がファイルを閉じて追加モードで再度開いた場合に失敗するため、最善の解決策ではありません。

于 2010-02-25T15:40:50.393 に答える
1

おそらく、Dazzle がファイルの書き込みを完了したことを示すために、Dazzle にダミー ファイルまたはフラグ ファイル (日付/タイム スタンプやシーケンス番号など、必要なものを含めることができます) を書き出させることができます。あとは、このファイルの存在をテストして、ファイルが完成したことを確認するだけです。

于 2010-02-25T15:45:25.190 に答える
1

これはおそらく優れた解決策ではありませんが、ファイルの名前を繰り返し変更して、失敗した場合は少しスリープ状態にすることができます。

于 2010-02-25T15:40:12.737 に答える