满心欢喜的为Servlet 添加上异步支持注解(asyncSupported = true),不曾想,其异步特性完全不起作用,仔细检测项目,发现存在一个编码拦截器(Filter),虽使用注解,但未标明支持异步,导致被拦截的标注为异步支持的Servlet,异步特性皆失效。怎么办,在Filter中注解里面添加asyncSupported = true。问题解决。
但转念一想,因历史原因,遗留系统会存在很多的Servlet 2.*规范的Filter,无法支持异步,怎么办?全部手动修改为注解版本,可能不太现实。还好,Doug Lea的JUC并发包,为我们提供了一种实现思路。
实际步骤:
- 准备一个线程池
- 把当前请求相关属性包装进一个任务线程中
- 获取当前任务线程执行结果(不一定会有返回值)
- 阻塞,执行完毕或超时,或被中断异常,可以输出客户端
- 整个请求结束
实际上,提交到一个线程池的任务线程,默认会返回一个Future对象,利用Future对象的get方法阻塞的特性,当前请求需要等待任务线程执行的结束,若指定时间内任务线程顺利完成,则不必等到设定的时间的边界即可自然往下执行。
实际代码:
需要备注说明的是,若Future.get()无参数,则意味着需要等待计算完成,然后获取其结果。这样可不用设定等待时间了。更多信息,请参考JDK。