当前位置: 首页 > 知识库问答 >
问题:

异步servlet如何在不打开更多线程情况下保持与http客户端的连接

薄鸿远
2023-03-14

通常情况下,如果java webserver希望为多个请求提供服务(Jetty,...),服务器必须为每个请求打开一个线程。并且如果您有大量的请求,您必须将线程放入池中,以保持服务器工作而不死。
所以一些较新版本的Jetty支持异步Servlet,允许服务器保存所有请求的信息,而不需要线程等待事件将响应发回给客户端。您可以在此链接中找到
我有一些代码行:

public class AsyncServlet extends HttpServlet implements OnEventCome {

List<AsyncContext> listContext = new ArrayList<>();

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    AsyncContext ctxt = req.startAsync();
    ctxt.setTimeout(3600000l);
    synchronized (listContext) {
        listContext.add(ctxt);
    }
}

@Override
public void onEventCome() {
    synchronized (listContext) {
        for (AsyncContext ctxt: listContext) {
            ctxt.start(new Runnable() {
                @Override
                public void run() {
                    ctxt.complete();
                }
            });
        }
        listContext.clear();
    }
}
}

函数doPost获取客户端的请求信息并立即完成。事件OnEventCome将等待一个事件将所有响应发送给所有客户端。
我的问题是:servlet如何在不打开任何线程的情况下使所有客户端保持连接并等待响应?

共有1个答案

慕飞章
2023-03-14

异步方式仍然使用线程,但如果资源不可用,它会将所有内容放入一个池中,而不是立即拒绝连接。

你提供的链接在最后一节给出了答案,我已经加了重点:

异步请求处理

Jetty Continuation(和Servlet3.0异步)API在servlet API中引入了一个更改,允许将请求多次调度到servlet。如果servlet没有调度所需的资源,那么请求将被挂起(或置于异步模式),这样servlet就可以从调度返回,而不发送响应。当等待的资源变得可用时,请求被用一个新线程重新调度到servlet,并生成一个响应。

 类似资料:
  • 在Python中,我将“WebSockets”库用于websocket客户端。 问题是一旦收到响应,客户端websocket连接就会断开。我希望连接保持打开,以便以后可以发送和接收消息。 为了保持websocket打开并能够在以后发送和接收消息,我需要做哪些更改?

  • 我正在尝试将我的应用程序从apache http组件客户端切换到异步版本。目标是能够处理更多的出站连接(在不久的将来)。请求的负载非常小( 与同步版本的apache超文本传输协议客户端,通过把大约200请求/秒。平均响应时间约为100ms/请求。我在最大180ms后中止请求。 切换到异步后,响应时间增加了20ms/请求。吞吐量也降低到160/秒。中止的请求数量增加了一倍。 这是在对应用程序进行了很

  • 我想用.bat运行一个jar文件(jar文件似乎不想自己打开,但现在这是一个不同的问题),但由于Java文件运行了很长时间,命令提示符仍处于打开状态(而.bat/.jar仍在运行) 我不想这样。 我在某处读到可以使用.cmd文件和以下命令: 若要在没有命令提示符的情况下运行bat文件,请执行以下操作。但那对我不起作用。当我单击.cmd程序时,它只是打开一个命令promopt,并在循环中反复打印“c

  • 我在Go中有以下代码。Go使用超文本传输协议保持连接。因此,根据我的理解,不会创建新连接,因为Go语言使用默认的持久连接。 > 据我所知,HTTP持久连接一次只能发出一个请求,即第二个请求只能在第一次响应之后发出。然而,如果多个线程调用会发生什么?将在前一个请求得到响应之前是否发送另一个请求? 我假设服务器超时了客户端建立的任何保持活动的连接。如果服务器超时,那么下一次,它会建立新的连接吗?

  • 我正在使用Android异步Http客户端。我的代码看起来像这样,并且运行良好。 我实现了一个静态HTTP客户端。我的服务器返回这个JSON数据。我不想将其视为字符串并将其转换回JSON。但是当我将其更改为eclipse告诉我 new AsyncHttpResponseHandler(){}类型的onSuccess(JSONObject)方法必须重写或实现超类型方法

  • 异步Http客户端 Get方式 1.使用域名形式 use AsyncHttp; //直接使用域名, get方式 $http = new AsyncHttp('http://groupco.com'); //设置2s超时 $http->setTimeout(2); //$http->setCookies(['token' => 'xxxx']);