【问题标题】:Java Non-Blocking HTTP ServerJava 非阻塞 HTTP 服务器
【发布时间】:2011-11-13 04:20:14
【问题描述】:

我使用嵌入式 Jetty 编写了一个应用程序,它可以对其他服务进行网络调用。

我假设服务线程在等待网络调用完成时处于空闲状态。

有没有办法让工作线程在请求​​之间切换以执行可以在当前时间完成的工作,然后当网络调用返回时也处理它?完成所有工作后,将返回一个请求。

我知道这是一个常见的范例,我已经将它用于非阻塞 TCP 网络,但我不确定如何在 Java HTTP 服务器上实现这一点,同时还要等待外部结果。

感谢任何链接或解释。

谢谢

更新: 我正在使用 Membase 和 ElasticSearch(唯一的网络调用)。 Membase 返回“Future”对象,ElasticSearch 返回“ListenableActionFuture”。我希望能够在线程上继续处理以响应这些返回的对象。

【问题讨论】:

  • 您使用的是哪个版本的 Jetty?我知道最新的支持 Servlet 3.0 API,它具有异步请求处理的功能。但我不知道所有细节。

标签: java multithreading http nonblocking


【解决方案1】:

您可以看看Deft,它是单线程、异步、事件驱动的 Web 服务器。

【讨论】:

    【解决方案2】:

    Netty 是一个 java 库,可让您进行异步网络。

    http://www.jboss.org/netty

    Netty 支持 http,但它是一个相当低级的库。

    一个更高级别的库是twitter的finangle,

    http://twitter.github.com/finagle/

    Finangle 建立在 netty 之上,但支持连接池、负载平衡,并具有许多其他功能。 Finangle 支持 http。

    【讨论】:

      【解决方案3】:

      如果你想和IO同时做工作,我建议你添加一个线程池来执行工作。可以重复使用现有的线程,但它需要做很多额外的工作,而收益可能太少。

      【讨论】: