web-dev-qa-db-ja.com

web.xmlで非同期サポートの目的は何ですか?

<servlet>
        <description>xxx</description>
        <servlet-name>xxx</servlet-name>
        <servlet-class>com.xxx.yyy</servlet-class>
        <async-supported>true</async-supported>
</servlet>

サーブレットのweb.xml構成ファイルのasync-supportedの目的は何ですか?どのような場合に使用できますか?

36
jiafu

皮肉なことに、Tomcatのweb.xmlでこのプロパティを記述する方法の構文を探していました。これは、Googleから開いた最初の検索項目です。

質問に答えるために、これにより、サーブレットは後で応答するために着信リクエストを保存できます。サーバーが応答を送信する準備ができるまで他の場所で使用できるように、要求の処理に使用されたスレッドを解放します。

実際の目的のために、この構成では、(実際に) Push クライアントにデータを送信するサーブレットをセットアップできます。 (クライアントがサーバーに最初のリクエストを送信した後)。

この手法は、不確かな間隔で変化する可能性のあるデータを取得するために、クライアントからの不必要なタイミング要求の必要性を置き換えます。そして、スレッドにぶら下がることなく、スケーラブルな方法でそれを行います。


ユースケースの例を次に示します。

チャットアプリケーション。1つのクライアントがメッセージを入力すると、他のクライアントに即座に表示されます。

電子メールアプリ。クライアントが電子メールサーバーで受信するとすぐに電子メールを表示できるようにします。

また、自動化タスクのためにプログラミングロジックコントローラーからブラウザーに入力変更の更新を送信するためにも使用しました。

こちら 良いチュートリアルです。 This は、Javaのナットとボルトもカバーしています。

47
Geronimo

主な目的は、WebsocketへのフォールバックメカニズムとしてXHRストリーミングを有効にすることです。 trueに明示的に設定されていない場合、アプリケーションはXHRストリーミングにフォールバックできず、Java.lang.IllegalArgumentExceptionが発生します。サーブレットで非同期サポートを有効にする必要があります。

詳細については、こちら(サーブレット3の非同期リクエスト)を確認してください。
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html

構成が正しく適用されていることを確認するには、ブラウザーのソケット接続の数を1に制限し、アプリケーションを複数のタブで開きます。設定が適用される場合、タブ1でWebSocket接続が確立され、タブ2でhxrストリーミングが確立されます。

3
magiccrafter

GlassFish 4.1を使用している場合は、src/main/webapp/web.xmlでこれを試してください。

<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
1
peter_pilgrim