异步过滤器-19

当过滤器的处理需要较长时间时会长时间占用一个web容器线程。
然而异步处理可以节省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();
        }

    }

}

如果在实际中处理异步的请求,不管是Servlet还是Filter都不是最好的选择,使用监听器来完成这样的工作是最好的

与异步Servlet的关系:当过滤器是异步处理时,请求的Servlet如果也是异步处理,则获取AsyncContext实例需要使用HttpServletRequest的getAsyncContext方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要确保代码支持异步操作的过滤器,您可以在过滤器类上添加@ServletComponentScan注释,以便使用Spring boot的内置servlet容器。然后,您可以使用@Order注释来指定过滤器的顺序。在执行过滤器前,Spring Boot会检查是否支持异步操作。如果支持,则将使用异步操作来处理请求。下面是一个例子: ```java @ServletComponentScan @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` ```java @WebFilter(urlPatterns = {"/*"}) @Order(1) public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化方法 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { if (servletRequest.isAsyncSupported()) { final AsyncContext asyncContext = servletRequest.startAsync(); asyncContext.setTimeout(10000L); asyncContext.addListener(new AsyncListener() { @Override public void onComplete(AsyncEvent event) throws IOException { // 异步处理完成后执行的操作 } @Override public void onTimeout(AsyncEvent event) throws IOException { // 异步处理超时时执行的操作 } @Override public void onError(AsyncEvent event) throws IOException { // 异步处理出错时执行的操作 } @Override public void onStartAsync(AsyncEvent event) throws IOException { // 异步处理开始时执行的操作 } }); filterChain.doFilter(servletRequest, servletResponse); } } @Override public void destroy() { // 过滤器销毁方法 } } ``` 在上面的例子,我们使用@WebFilter注释来指定要过滤的URL模式。然后,我们使用@Order注释来指定过滤器的顺序。在doFilter方法,我们检查servletRequest是否支持异步操作。如果支持,则调用startAsync方法来启动异步处理。然后,我们添加一个AsyncListener来处理异步处理完成后的操作。最后,我们调用filterChain.doFilter方法来继续处理请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值