我的 servlet 执行三个任务:
当它收到消息时,“resourceupdate”将请求的资源(HTML 页面)存储到对象 sharedClient。
当它接收到异步获取(由“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 servlet 工作正常,但是当我执行 delivery_resource(到 myServlet/sharedsessionID 类型的路径)时,servlet 无法获取 sharedClient 引用,并且我得到一个空指针异常。
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
从这个时候开始,异步获取的长轮询也没有成功完成。
如果我在更新后没有对 myServlet/sharedsessionID 类型的路径执行 delivery_resource,则异步获取继续正常运行。
谢谢大家。