1

我正在开发一个基于netty版本4的分析系统,以及一个基于tomcat的web客户端应用程序。

Web 应用程序接受用户的输入,然后将其发送到分析机。最后在 HTML 页面中打印响应。

这是将用户输入发送到分析节点的 servlet 中的代码:

protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
String input = request.getParameter("input");
Channel ch = pool.borrowObject();
Protocol.Builder builder = Protocol.newBuilder().setInput(input);
ch.writeAndFlush(builder.build());
}

Netty 是异步工作的,所以 http 请求发送后结束。

这是响应处理程序中的代码:

@Override
    protected void channelRead0(ChannelHandlerContext ctx, Protocol response)
            throws Exception {
pool.returnObject(ctx.channel());
//How could I code here to display response to the HTML page that user requested?
}

我已经在这里挣扎了几个星期。我尝试使用公共的线程安全队列让 http 请求在那里等待,直到从队列中获得响应。但这使得整个请求变得同步。

谁能告诉我该怎么做?非常感谢!

4

1 回答 1

2

这里的问题是默认的 servlet 请求生命周期是同步的。在 servlet 容器中解决此问题的唯一方法是使用 servlet 3.0 异步请求处理。这样你可以将请求传递给 Netty 并返回,然后在响应到达时异步写入响应。

一些帮助您入门的链接

Java Servlet 3.0 异步支持

如何使用异步 Servlet 提高性能

于 2013-10-17T08:01:47.227 回答