Java Jetty中的异步与非异步
我有一个简单的jetty服务器,我正在学习不同的方法。我已将此改编: 这应该是一个阻塞servlet。我的理解是,这是单线程的,因此,如果我同时发送2个请求,第二个请求将仅在第一个请求完成后处理Java Jetty中的异步与非异步,java,embedded-jetty,Java,Embedded Jetty,我有一个简单的jetty服务器,我正在学习不同的方法。我已将此改编: 这应该是一个阻塞servlet。我的理解是,这是单线程的,因此,如果我同时发送2个请求,第二个请求将仅在第一个请求完成后处理 然而,当我实际测试它时,它们同时完成(几乎就像它已经是异步的)。如果是这样,为什么我需要AsyncContext async=request.startAsync()?这有什么区别呢?我认为您混合了两件事:异步和阻塞 servlet不是单线程的。事实上,Jetty将在启动期间初始化线程池,在传统方法中,
然而,当我实际测试它时,它们同时完成(几乎就像它已经是异步的)。如果是这样,为什么我需要
AsyncContext async=request.startAsync()代码>?这有什么区别呢?我认为您混合了两件事:异步和阻塞
servlet不是单线程的。事实上,Jetty将在启动期间初始化线程池,在传统方法中,池中的新线程将分配给每个请求
但是,如果您需要为数千个请求提供服务,那么这可能不是非常可扩展的
自Servlet 3.0以来,您可以通过将请求注册到队列或列表(我不知道AsyncContext是如何实现的)并通过“工作线程”处理已注册的请求(可以使用另一个线程池管理)来解耦(尝试使其非阻塞)
但这并不意味着我不能编写最终会阻塞另一个工作线程的阻塞代码。我认为您混合了两件事:异步和阻塞
servlet不是单线程的。事实上,Jetty将在启动期间初始化线程池,在传统方法中,池中的新线程将分配给每个请求
但是,如果您需要为数千个请求提供服务,那么这可能不是非常可扩展的
自Servlet 3.0以来,您可以通过将请求注册到队列或列表(我不知道AsyncContext是如何实现的)并通过“工作线程”处理已注册的请求(可以使用另一个线程池管理)来解耦(尝试使其非阻塞)
但这并不意味着我不能编写最终阻塞另一个工作线程的阻塞代码。是的,doGet()是阻塞的,是单线程的。建议:在“睡觉”之前,写一条日志信息。确保打印时间(以分钟/秒/毫秒为单位)和线程ID。我注意到doPost也有同样的行为。doPost需要它吗?我确实同时使用S.O.P消息完成了这两项工作,但它仍然是并行完成的。有多个线程为请求提供服务。尝试同时发送1000个请求,看看会发生什么。是的,doGet()正在阻塞,并且是单线程的。建议:在“睡觉”之前,写一条日志信息。确保打印时间(以分钟/秒/毫秒为单位)和线程ID。我注意到doPost也有同样的行为。doPost需要它吗?我确实同时使用S.O.P消息完成了这两项工作,但它仍然是并行完成的。有多个线程为请求提供服务。尝试同时发送1000个请求,看看会发生什么。
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\"}");
}
}