2

サーバーからファイルをダウンロードするように要求します。問題は、ファイルがサーバー側で生成され、生成が非同期であることです。

最初は次のようなことをしました

try { Thread.sleep(10000); } catch (Exception e) { //TODO }

そして、新しくダウンロードしたファイルで何かをします。

問題は、ファイルの生成に 10 秒以上かかる場合と、それより短い場合があることです。したがって、私の「テスト」はランダムに合格または不合格になります。

私の最初の試みは、サーバーでファイルが見つかり、たとえば2分後にタイムアウトになるまで、リクエストを繰り返し(1000ミリ秒ごとに)行うことでした。しかし、これは本当に悪い設計だと思います。

では、ファイルが生成されるのを待ってからダウンロードする最善の方法は何ですか?

編集: http 通信を使用します。

4

2 に答える 2

1

何らかの通知を受け取る方法がない限り (Amazon がバックグラウンド ジョブで行っているように)、できることはほとんどポーリングしかありません。

あなたが話しているのがほんの数秒(分や時間ではなく)であり、サーバー側を制御している場合、ファイルが作成されるまでリクエスト処理をブロックすることができます。

于 2013-05-16T08:16:30.213 に答える
1

ブロッキング I/O 操作はどうですか?

このようなもの:

http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html

リモートサーバーとどのように通信しますか? ソケット?HTTP?

HTTP の編集: サーバー側にもアクセスできる場合は、ファイルが作成されていなくても、ファイルの content-length を含む HTTP ヘッダーを送信するだけで、実際に作成されるまでクライアントが「接続」されます。タイムアウトにも注意してください。また、ファイルを直接出力 (転送) することもできます (ファイルが完了するのを待つ必要はありません)。これにより、タイムアウトの問題が解消されると思います。

于 2013-05-16T08:17:03.513 に答える