如何解决Jetty 中的异步与非异步
我有一个简单的码头服务器,我正在学习不同的方法。我有这个改编from here:
public class BlockingServlet extends HttpServlet {
protected void doGet(
HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
response.setContentType("application/json");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("{ \"status\": \"ok\"}");
}
}
这应该是一个阻塞 servlet。我的理解是这是单线程的,因此如果我同时发送 2 个请求,则第二个请求只会在第一个请求完成后处理。
然而,当我实际测试它时,它们同时完成(几乎就像它已经是异步的)。如果是这样,我为什么需要AsyncContext async = request.startAsync();
?这有什么区别?
解决方法
我认为您将两件事混为一谈:异步和阻塞。
Servlet 不是单线程的。实际上,Jetty 会在启动时初始化一个线程池,在传统方法中,每个请求都会从池中分配一个新线程。
但是,如果您需要处理数千个请求,这可能不太具有可扩展性。
从 Servlet 3.0 开始,您可以通过将请求注册到队列或列表(我不知道 AsyncContext 是如何实现的)并处理注册的请求来解耦(尝试使其非阻塞)“请求线程”您的“工作线程”发出的请求,可以使用另一个线程池进行管理。
但这并不意味着我不能编写一个阻塞代码,最终阻塞另一个工作线程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。