2011-02-01 2 views
2

私のクライアントは返すものがあればX秒以内に結果を返すことができるようにしたい。そうでない場合は "返信することができません"というメッセージが表示されます。サーブレット要求に対して、X秒のセマンティクスでどのように返答しますか?

これは本当に同期ですタイムアウトを指定してサーブレットを呼び出します。この種の行動の確立されたパターンはありますか?

これを行うにはどうすればよいでしょうか?

答えて

3

リクエストハンドラスレッドは、myQueueと呼ばれるBlockingQueueを作成し、終了時にその結果をキューに入れるワーカースレッドに与えます。次に、ハンドラスレッドは "myQueue.poll(X, TimeUnit.SECONDS)"を呼び出し、シリアル化された結果を取得するとシリアル化された結果を返します。代わりにヌルを取得すると "タイムアウト"エラーを返します( "poll"コールのタイムアウトを意味します)。ここではそれがどのように見えるかの例である:一般的なスレッド管理は、(しかし、特にサーブレットコンテナ内)落とし穴に満ちているので、あなたがあなたのサーブレット仕様と動作に非常に精通する必要があること

// Servlet handler method. 
BlockingQueue<MyResponse> queue = new ArrayBlockingQueue<MyResponse>(); 
Thread worker = new Thread(new MyResponseGenerator(queue)); 
worker.start(); 
MyResponse response = queue.poll(10, TimeUnit.SECONDS); 
if (response == null) { 
    worker.interrupt(); 
    // Send "timeout" message. 
} else { 
    // Send serialized response. 
} 

注意本番システムでこのパターンを使用する前に、特定のサーブレット・コンテナを使用してください。

ThreadPoolを使用することも考えられますが、もう1つ複雑なレイヤーが追加されます。

+0

タイムアウトを超えてスレッドを試行して停止させることに加えて、ワーカーにスレッドプールを使用することも検討する必要があります。 Webアプリケーションで作成されたスレッドの数の上限を制御できることを確認する必要があります。スレッドをクリーンアップせずにスレッドプールを使用しないと、スレッド同士が互いに競合し、全体の混乱を遅らせる大きなスレッドができます。 – rfeak

+0

@rfeak、これはサーブレットコンテナにありますが、スレッドプールを作成できますか? – mafalda

+0

@maerics、どのようにワーカースレッドを作成しますか? – mafalda

関連する問題