0

我的 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,则异步获取继续正常运行。

谢谢大家。

4

1 回答 1

0

好的,我解决了。

我需要写

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

在 myServlet 声明之前。

于 2012-12-04T14:54:44.313 回答