私のサーブレットは 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 は引き続き適切に機能します。
ありがとうございます。