1

我有一个 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() 方法的完成,响应对象变为空。当 processComplete() 被调用时,响应对象将为空 - 从而阻止我写出任何数据。

看起来好像 servlet 在调用异步方法后立即关闭连接。

将观察者模式用于异步任务时,是否有更好的方法来实现这种类型的 servlet?我应该以其他方式执行此操作吗?

4

2 回答 2

3

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

这个问题的答案应该为您指明正确的方向。

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

于 2013-04-05T12:57:48.113 回答
1

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

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

于 2013-04-05T13:04:14.287 回答