Skip to main content

异步请求(Servlet3.0)

在Servlet 3.0之前,Servlet采用 Thread-Per-Request 的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理。 如果一个请求需要进行IO操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待IO操作完成。而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题。

即便是像Spring、Struts 这样的高层框架也脱离不了这样的桎梏,因为他们都是建立在Servlet之上的。为了解决这样的问题,Servlet 3.0 引入了异步处理,然后在Servlet 3.1中又引入了非阻塞IO来进一步增强异步处理的性能。

Hasor 会自动识别容器的 Servlet 版本。因此 Hasor 在自动识别的帮助下可以做到 Servlet 2.x 和 Servlet 3.x 标准互容,这似的 Hasor 可以同时工作在两种 Servlet 平台之上。

如果你想使用 Servlet 3.0 的异步请求,先要确保你的 Web 容器支持 Servlet 3.0,否则异步请求会当做普通请求处理。

然后像如下这样标记一个 @Async 就可以了,Hasor 会自动在 Servlet 3.0 容器下通过 javax.servlet.AsyncContext.start 方法启动异步处理。

例子
@Async
@MappingTo("/helloAction.do")
public class HelloAction {
public void execute(@RequestParameter("name") String userName,
@RequestParameter("pwd") String pwd) {
...
}
}

或者标记在方法上

配置拦截器
@MappingTo("/helloAction.do")
public class HelloAction {
@Async
public void execute(@RequestParameter("name") String userName,
@RequestParameter("pwd") String pwd) {
...
}
}