0

私のサーブレットは 3 つのタスクを実行します。

メッセージを受信すると、「resourceupdate」は要求されたリソース (HTML ページ) をオブジェクト sharedClient に格納します。

非同期の get (「t = UPDATE」で示されるクエリ文字列) を受け取ると、このリクエストが保留中のオブジェクト sharedClient を追加します。

delivery_resource (pathinfo myServlet/sharedsessionID で示される - myServlet/8439jfndofsd93jcanjc など) を受け取ると、リソースのディスパッチを実行します。

これは私の Web.xml です:

<servlet>
    <description></description>
    <display-name>MyServlet</display-name>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>it.package.MyServlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/MyServlet/*</url-pattern>
</servlet-mapping>

この方法ですべてのアクティブな SharedClients を保持します。

ConcurrentHashMap<String, SharedClient> hmClients = (ConcurrentHashMap<String, SharedClient>)    this.getServletConfig().getServletContext().getAttribute("sharedClients");

そして、この方法で特定の SharedSessionID を持つ SharedClient を取得します。

SharedClient targetClient = hmClients.get(ssid);

ここでの問題: resourceupdate サーブレットを実行するまでは正常に動作しますが、(タイプ myServlet/sharedsessionID のパスへの) delivery_resource を実行すると、サーブレットは sharedClient 参照を取得できず、Null Pointer Exception が発生します。

if (resourceUri!=null) {
String ssid = resourceUri.substring(1);
ConcurrentHashMap<String, SharedClient> hmClients = (ConcurrentHashMap<String, SharedClient>) this.getServletConfig().getServletContext().getAttribute("sharedClients");
if (hmClients.containsKey(ssid)) {
    SharedClient targetClient = hmClients.get(ssid);
    if (targetClient.getParticipantSession().containsKey(session)) { 
    IoUtils.copy(targetClient.streamSnapshot(), response.getOutputStream());
        }
} else System.out.println("hmClient do not contains ssid"); //always in this branch

この時点から、非同期 get を使用したロング ポーリングも正常に完了しません。

更新後にタイプ myServlet/sharedsessionID のパスに delivery_resource を実行しない場合、非同期 get は引き続き適切に機能します。

ありがとうございます。

4

1 に答える 1

0

わかりました、解決しました。

私は書く必要があります

 @WebServlet(urlPatterns = {"/myServlet/*"}, asyncSupported=true)

myServlet 宣言の前。

于 2012-12-04T14:54:44.313 に答える