2016-05-19 8 views
0

私のRuby on Railsアプリケーションでは、(Javaアプリケーションを介して)ファイルに書き込みを行い、書き込まれたファイルを読み込むルーチンを持っています。ファイルの書き込みは非同期で行われますか?

write_to_file(file.path, data) 
read_file(file.path) 

ほとんどの場合、これは大丈夫です。しかし、ファイル書き込みが起こらなかったように見えますが、エラーもありませんでした。そして、同じデータを使ってルーチンを再試行すると、そのたびにうまくいきました。

私は、ファイルの書き込みが非同期的に発生し、データがディスクに書き込まれる前に、ファイルが実際に読み込まれている場合だと思うし始めています。これは可能でしょうか?

write_to_fileは書き込みの世話をするソケット接続を介してJavaアプリケーションを呼び出します。 Javaアプリケーションは単純なjson文字列をRailsに返します。

答えて

0

あなたはそれがフラッシュされていますしない限り、少量のデータがファイルに書き込まれていないファイルのバッファリングを経験している可能性があります。私はあなたがここでどのインタフェースを使用しているか分かりませんが、flushメソッドはこの正確な状況に対処することを意図しています。

3

この質問は実際には「Javaコードは何ですか」 Rubyの質問ではありません。実際にはJavaの質問でもありません。なぜなら、Java言語は(もちろん)あらゆる実装を可能にするからです。

Javaコードは、ファイルが読み込み可能になる前に確実に戻っている可能性があります。私たちは分かりません。キューに要求をポストしてから、たとえば返すことができます。

Javaコードが必要です。

sleep 0.01 until File.readable?(file.path) 

これは、ビット原油で、これを行うにはよりエレガントな方法があるが、それは動作します:あなたはそれを気にしたくない場合は、常にこのような何かを行うことができます。

+0

私はちょうどその答えに 'sleep'を使って回避策を追加しました。 –

+0

ありがとうございます。 'File.readable?'で十分ですか?つまり、私のプロセスはファイルを読み取ることができましたが、コンテンツは更新されていません。 Javaアプリケーションは、新しいファイルを作成するのではなく、既存のファイルを変更しています。ファイルのタイムスタンプを調べて、ファイルが実際に更新されたかどうかを判断する必要がありますか? – Mika

+0

Hmm ..ファイルのタイムスタンプには秒が含まれています。これはすべて1秒で起こります。そしてJavaアプリケーションでは、Apache POIの関数を使用してExcelファイルを更新します。だから、それはPOIがファイルをどのように保存するかを本当に沸かせます。 – Mika

関連する問題