Java Servlet - 导致null响应对象的Observer模式

时间:2013-04-05 12:47:11

标签: java servlets

我有一个Java HttpServlet。此servlet包含一组使用观察者模式的对象,以便通过servlet的Response对象返回数据。这是HttpServlet中我的doGet()方法的简化版本:

protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
    MyProcess process = new MyProcess();
    // This following method spawns a few threads, so I use a listener to receive a completion event.
    process.performAsynchronousMethod(request, new MyListener() {
        public void processComplete(data) {
            response.getWriter().print(data.toString());
        }
    }
}

如示例所示,我有一个我执行的进程,它生成各种线程以生成最终数据集。此过程可能需要几秒到一分钟。我的问题是,似乎当doGet()方法完成时,响应对象变为null。当调用processComplete()时,响应对象将为null - 从而阻止我写出任何数据。

一旦调用异步方法,似乎servlet正在关闭连接。

使用观察者模式进行异步任务时,是否有更好的方法来实现这种类型的servlet?我应该用另一种方式吗?

2 个答案:

答案 0 :(得分:3)

当doGet方法终止时,servlet响应将被发送回客户端,它也不会等待异步调用完成。您将需要找到一种方法来阻止所有异步任务完成,然后才允许doGet()方法返回。

this question的答案应该指向正确的方向。

需要注意的是,您无法保证线程会串行写入响应写入器,您可能会发现各种打印操作重叠并且输出会出现乱码(这对您来说无关紧要,取决于数据是什么,以及如何使用数据)

答案 1 :(得分:1)

您可以尝试spec version 3.0中提供的异步servlet,并非所有Web服务器都支持它,只有一些现代的。但这意味着服务器将在这段时间内保持套接字连接。因此,您应该知道可以同时连接多少客户端,并非所有硬件/操作系统都可以处理大量开放连接。

Web客户端将等待,并且可能会超时。您还应该考虑可以断开套接字连接并且客户端永远不会得到结果的情况(例如,某些代理服务器会中断长时间运行的连接)。所以你应该允许“恢复”操作。