doGet 方法完成后,Servlet return 是否响应?
Does Servlet return response after doGet method has finished?
显然,doGet
方法有一个 return 类型的 void,因此,它没有 return 任何东西。从这个意义上说,我使用 "return" 这个词来表示将响应发送回请求它的客户端。
我正在尝试实现一个长轮询 Servlet。在我有我想发回的东西之前不发送响应对它来说是有益的。因此,在 doGet 方法中,我将已连接用户的 ID 和 AsyncContext 添加到地图中:
private ConcurrentMap<String, AsyncContext> contexts = new ConcurrentHashMap<>();
//...in the doGet method when I need to add the context...
contexts.put(userId, context);
然后,当我有东西要发回时,我可以检索适当的上下文并写入它的响应输出流:
AsyncContext context = contexts.get(userId);
PrintWriter writer = context.getResponse().getWriter();
writer.write("something to send to the client");
但是,客户端似乎从未收到响应。查看浏览器开发人员控制台中的“网络”选项卡,我可以看到发送了 GET 请求,然后是 returns(状态为 200)。这发生在我实际寄回一些东西之前。这让我相信在 doGet 方法完成后响应是 returned。也许正因为如此,在这一点之后,由于连接未打开,无法向客户端发送任何内容。
doGet方法是否在方法执行完成后将响应发送给客户端?如果是这种情况,如何保持连接打开以实现长轮询效果?
是的,当 doGet() 完成执行时,响应流被刷新并关闭。
长时间占用 UI 个线程违反了 Java 企业最佳实践。
建议您 return 如果没有任何响应,则立即 return,并在客户端(浏览器)端实现一个计时器,以每隔一段时间轮询服务器以获取结果。
回答我自己的问题:Does the doGet method send the response to the client once the method is finished executing?
是的,当 doGet(或任何 HttpServlet 方法,例如:doGet、doPost 等)方法完成执行时,它会将响应发送回客户端。
If this is the case, how can I keep the connection open for a long-polling effect?
使用异步 Servlet(我正在使用它,但是,我发现我的特定问题一定在其他地方,但这些答案仍然与提出的问题相关)。在 ServletRequest 对象上调用 startAsync 方法,如下所示:
AsyncContext context = request.startAsync(request, response);
"This will notify the Web Container that at the end of the request call it should free the handling thread and leave the connection open so that other thread writes the response and end the connection."Reference Link.
此外,我将添加针对我的特定问题的解决方案(客户端未收到响应)是因为在我的 Servlet 中,我没有在 AsyncContext 对象上调用完整方法:
asyncContext.complete();
显然,doGet
方法有一个 return 类型的 void,因此,它没有 return 任何东西。从这个意义上说,我使用 "return" 这个词来表示将响应发送回请求它的客户端。
我正在尝试实现一个长轮询 Servlet。在我有我想发回的东西之前不发送响应对它来说是有益的。因此,在 doGet 方法中,我将已连接用户的 ID 和 AsyncContext 添加到地图中:
private ConcurrentMap<String, AsyncContext> contexts = new ConcurrentHashMap<>();
//...in the doGet method when I need to add the context...
contexts.put(userId, context);
然后,当我有东西要发回时,我可以检索适当的上下文并写入它的响应输出流:
AsyncContext context = contexts.get(userId);
PrintWriter writer = context.getResponse().getWriter();
writer.write("something to send to the client");
但是,客户端似乎从未收到响应。查看浏览器开发人员控制台中的“网络”选项卡,我可以看到发送了 GET 请求,然后是 returns(状态为 200)。这发生在我实际寄回一些东西之前。这让我相信在 doGet 方法完成后响应是 returned。也许正因为如此,在这一点之后,由于连接未打开,无法向客户端发送任何内容。
doGet方法是否在方法执行完成后将响应发送给客户端?如果是这种情况,如何保持连接打开以实现长轮询效果?
是的,当 doGet() 完成执行时,响应流被刷新并关闭。
长时间占用 UI 个线程违反了 Java 企业最佳实践。
建议您 return 如果没有任何响应,则立即 return,并在客户端(浏览器)端实现一个计时器,以每隔一段时间轮询服务器以获取结果。
回答我自己的问题:Does the doGet method send the response to the client once the method is finished executing?
是的,当 doGet(或任何 HttpServlet 方法,例如:doGet、doPost 等)方法完成执行时,它会将响应发送回客户端。
If this is the case, how can I keep the connection open for a long-polling effect?
使用异步 Servlet(我正在使用它,但是,我发现我的特定问题一定在其他地方,但这些答案仍然与提出的问题相关)。在 ServletRequest 对象上调用 startAsync 方法,如下所示:
AsyncContext context = request.startAsync(request, response);
"This will notify the Web Container that at the end of the request call it should free the handling thread and leave the connection open so that other thread writes the response and end the connection."Reference Link.
此外,我将添加针对我的特定问题的解决方案(客户端未收到响应)是因为在我的 Servlet 中,我没有在 AsyncContext 对象上调用完整方法:
asyncContext.complete();