1

Java HttpServlet があります。このサーブレットには、サーブレットの Response オブジェクトを介してデータを返すためにオブザーバー パターンを利用する一連のオブジェクトが含まれています。以下は、HttpServlet の doGet() メソッドの簡易バージョンです。

protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
    MyProcess process = new MyProcess();
    // This following method spawns a few threads, so I use a listener to receive a completion event.
    process.performAsynchronousMethod(request, new MyListener() {
        public void processComplete(data) {
            response.getWriter().print(data.toString());
        }
    }
}

例が示すように、実行するプロセスがあり、最終的なデータセットを生成するためにさまざまなスレッドを生成します。このプロセスには、数秒から 1 分かかる場合があります。私の問題は、doGet() メソッドが完了すると、応答オブジェクトが null になるように見えることです。processComplete() が呼び出されると、応答オブジェクトが null になるため、データを書き出すことができなくなります。

非同期メソッドが呼び出されるとすぐに、サーブレットが接続を閉じているように見えます。

非同期タスクにオブザーバー パターンを使用する場合、このタイプのサーブレットを実装するより良い方法はありますか? これを別の方法で行う必要がありますか?

4

2 に答える 2

3

doGet メソッドが終了すると、サーブレットの応答がクライアントに返されます。非同期呼び出しが終了するのも待ちません。すべての非同期タスクが完了するまでブロックし、その後でのみ doGet() メソッドが戻ることを許可する方法を見つける必要があります。

この質問に対する答えは、あなたを正しい方向に導くはずです。

他に注意すべきことは、スレッドが連続して応答ライタに書き込むという保証がないことです。さまざまな印刷操作がオーバーラップし、出力が文字化けすることに気付くかもしれません (これは、何によっては問題にならない場合があります)。データがどのように使用されるか)

于 2013-04-05T12:57:48.113 に答える
1

仕様バージョン 3.0で利用可能な非同期サーブレットを試すことができます。すべての Web サーバーがサポートしているわけではなく、一部の最新のサーバーのみがサポートしています。ただし、サーバーがこの時間だけソケット接続を保持することを意味します。したがって、同時に接続できるクライアントの数を知っておく必要があります。すべてのハードウェア/オペレーティング システムが多くのオープン接続を処理できるわけではありません。

Web クライアントは待機し、タイムアウトになる可能性があります。また、ソケット接続が切断され、クライアントが結果を取得できない状況も考慮する必要があります (たとえば、一部のプロキシ サーバーは長時間実行されている接続を切断します)。したがって、「再開」操作を許可する必要があります。

于 2013-04-05T13:04:14.287 に答える