1

着信 SIP 音声通話を受け入れ、同じホスト マシン上の Tomcat インスタンスで実行されている Java アプリケーションで Web サービスをポーリングして着信音声要求 (音声プロンプトを再生するか、数字を収集するなど) を取得する VXML アプリケーションを作成しています。別のチャンネル。これらの音声要求は、別の WS インターフェイスを介して受信され、収集する VXML セッション用にキャッシュされます。音声要求は、通話が受け入れられてから 0.5 秒から 30 秒以上後に受信される場合があります。

論理的には、VXML セッションは新しいリクエストを定期的にポーリングする必要があり、Tomcat の Java アプリケーションは、リクエストが受信されたかどうかを示すノンブロッキング レスポンスを返します。ただし、VXML インタープリターから Web サービス呼び出しを行うと CPU コストが非常に高くなるため、大量の同時呼び出しに対してこれを定期的に繰り返すと、システム容量に著しく影響するという追加の制約があります。

推奨されるアプローチは、音声サービス要求がキャッシュに到着するまで (たとえば 5 または 10 秒のタイムアウトで)、Web アプリケーションが VXML アプリケーションからのポーリングをブロックするようにすることです。ただし、サーブレットスレッドで Thread.sleep を長期間使用することは、最良の場合でも悪い考えであることを理解しているため、これを達成するための代替手段を探しています。

このアプリケーションは、サーバー上で大量の同時セッションをサポートする必要があるため (計画されたハードウェアでは最大 1000 の VXML セッションが予想されます)、Tomcat のスレッド数を増やすだけでは受け入れられません。

他のリクエストのためにサーブレット スレッドを解放している間、Tomcat にリクエストを一定期間傍受させる方法はありますか? ひょっとして、Tomcat は Thread.sleep を使用しているときに単純にこれを実行できるほど賢いのでしょうか? :-)

ありがとう、fb

4

1 に答える 1

1

Java で長時間実行されるリクエストとノンブロッキング I/O は、一般に「コメット」と呼ばれます。Tomcat 6 は独自の方法でこれをサポートしており、Servlet 3.0 仕様に組み込まれています。

両方を行う方法については、この記事を参照してください。

于 2011-01-31T15:15:08.523 に答える