2013-10-16 24 views
1

我正在开发基于netty version 4的分析系统和基于tomcat的web客户端应用程序。如何通过HTTP请求在HTML页面中显示异步结果?

网络应用程序接受用户的输入,然后将其发送到分析机。最后在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请求在那里等待,直到从队列中获得响应。但是这使得整个请求变得同步。

任何人都可以告诉如何做到这一点?非常感谢!

+1

Twitter的欺骗是包装为网状,这是否(及以上)。大部分编写finagle客户端的例子都在scala中,但我知道它也可以用于java。您可以从这里开始:https://blog.twitter.com/2011/finagle-protocol-agnostic-rpc-system – eSniff

+0

谢谢。我会看看。 – Michael

+0

@ norman-maurer如果你有时间,你可以看看这个吗?非常感激。 – Michael

回答

2

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

一些链接,以帮助您开始

Java Servlet 3.0 Asynchronous Support

How To Use Asynchronous Servlets To Improve Performance

+0

谢谢!你指出了做这件事的正确方法。 – Michael