【发布时间】:2015-11-11 05:30:43
【问题描述】:
我正在探索使用 Spring Boot 的异步 servlet。据我了解,异步 servlet 用于在一个线程中执行长时间运行的任务,而不是容器启动来处理请求的线程,以便容器可以使用自己的线程来处理其他连接。基于这样的理解,我尝试了以下代码:
@WebServlet(asyncSupported = true, urlPatterns = "/demo")
@Component
public class demo extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
final AsyncContext context = request.startAsync();
ServletOutputStream stream = response.getOutputStream();
WriteListener listener = new WriteListener() {
@Override
public void onWritePossible() throws IOException {
System.out.println(Thread.currentThread().getId());
ServletOutputStream output = context.getResponse().getOutputStream();
if (output.isReady()) {
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
output.print("Heloooooooooo");
}
context.complete();
}
@Override
public void onError(Throwable throwable) {
throwable.printStackTrace(System.err);
context.complete();
}
};
stream.setWriteListener(listener);
System.out.println(Thread.currentThread().getId());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
// TODO Auto-generated method stub
}
}
但问题是onWritePossible 方法正在由运行doGet 的同一线程调用。不应该不一样吗?
【问题讨论】:
-
通常会有两个请求。一个用于主页,另一个用于 websocket(页面加载后由 javascript 触发)
-
这与 websockets 无关。这是一个异步 Servlet,我正在尝试通过 localhost:8080/demo 访问它
标签: java servlets asynchronous spring-boot nio