java中因为权限的限制,我们项目里一般都会加上filter过滤器,然而当过滤器处理时占用时间较长的话就会一直占用一个web容器线程,这样是不行的,异步处理的话就可以解决这个问题,本篇文章就来看看如何异步处理过滤器。
异步过滤器配置:
需要设置@WebFilter的属性asyncSupport属性的值为true或在filter标签里使用async-supported标签进行设置。
示例:
@WebFilter(urlPatterns = "*", asyncSupported = true) public class Filter1 implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } private ExecutorService service = Executors.newCachedThreadPool(); //提高线程的创建性能 @Override public void doFilter(ServletRequest req, ServletResponse arg1 , FilterChain chain) throws IOException, ServletException { final AsyncContext context = req.startAsync(); //得到异步上下文 service.submit(new AsyncRequest(context)); //这样以线程池的方式来处理,在doFilter中就很简洁了 // context.start(new Runnable(){ // // @Override // public void run() { // try { // Thread.sleep(3000); // } catch (InterruptedException e) { // e.printStackTrace(); // } // System.out.println("AsyncFilter Done!"); // context.complete(); // } // // }); System.out.println("Filter Done!"); chain.doFilter(req, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } class AsyncRequest implements Runnable { //线程类 private AsyncContext context; public AsyncRequest(AsyncContext context) { //构造方法 this.context = context; } @Override public void run() { //具体的业务 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("AsyncFilter Done!"); context.complete(); } } }
PS:在实际中处理异步请求中,无论Servlet或Filter其实都不是最好选择,只有监听器在这样的工作中是爸爸。
以上就是本篇文章的所有内容,深入了解过滤器对项目的编写是很有帮助的,更多java面试常见问题快关注本站了解具体。
推荐阅读: