我的servlet执行三项任务:
当收到消息“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 servlet工作正常,但是当我执行delivery_resource(到一个类型为myServlet / sharedsessionID的路径)时,servlet无法获取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的长轮询也未成功完成。
如果我在更新后没有将delivery_resource发送到myServlet / sharedsessionID类型的路径,则异步get继续正常运行。
感谢所有人。
答案 0 :(得分:0)
我需要写
@WebServlet(urlPatterns = {"/myServlet/*"}, asyncSupported=true)
在myServlet声明之前。