IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 基于Servlet实现请求的隔离的代码实现 -> 正文阅读

[移动开发]基于Servlet实现请求的隔离的代码实现

1.接受请求

@RequestMapping("/book")
public void getBook(
  HttpServletRequest request;
  @RequestParam(value="skuId") final Long skuId;
  @RequestParam(value="cat1") final Integer cat1;
  @RequestParam(value="cat2") final Integer cat2
) throws Exception
{
  oneLevelAsyncContext.submitFuture(request,()->bookService.getBook(skuId,cat1,cat2));
}

2.业务线程池封装

public void submitFuture{
  
  final HttpServletRequest req,final Callable<Object> task){
    final String uri = req.getRquestURI();
    final Map<String,String[]> params = req.getParameterMap();
    final AsyncContext asyncContext = req.startAsync();
    asyncContext.getRequest().setAttribute("uri",uri);
    asyncContext.getRequest().setAttribute("params",params);
    asyncContext.setTimeout(asyncTimeoutInSeconds*1000);
    if(asyncListener != null){
      asyncContext.addListener(asyncListener);
    }

    executor.submit(new CanceledCallable(asyncContext){
     @Override
     public Object call() throws Exception{
       Object.o = task.call();//业务处理掉用
       if(o == null){
         callback(asyncContext,o,uri,params);
       }
       if(o instanceof CompletableFuture){
         CompletableFuture<Object> future = (CompletableFuture<Object>)o;
         future.thenAccept(resultObject->
         .callback(asyncContext,resultObject,uri,params)
         .exceptionally(e->
         callback(asynccontext,"",uri,params))
         return null;);
       })else if(o instanceof String){
         callback(asyncContext,o,uri,params);
       }
       return null;
    }
    });
  }
}


private void callback(AsyncContext asyncContext,Object result,String uri,Map<String,String[]> params){
  HttpServletResponse resp = (HttpServletResponse) asyncContext.getResponse();
  try{
    if(result instanceof String){
      write(resp,(String)String);
    }else{
      write(resp,JSONUtils.toJSON(result));
    }
  }catch(Throwable e){
    resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);//程序内部错误
    try{
      LOG.error("get info error,uri:(), params: {}");
    }catch(Exception ex){}
  }finally{
    asyncContext.complete();
  }
}

3.线程池初始化

public void afterPropertiesSer() throws Exception{
  
  String[] poolSize = poolSize.aplit("_");
  //初始化线程池大小
  int corePoolSize = Integer.valueOf(poolSize[0]);
  //最大线程池大小
  int maximumPoolSize = Integer.valueOf(poolSize[1]);
  queue = new LinkedBlockingDeque<Runnable>(queueCapacity);
  executor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTimeinSeconds,TimeUnit.SECONDS,queue);
  executor.allowCoreThreadTimeout(true);
  executor.serRejectedExeturionHandler(
    new RejectedExecutionHandler(){
      @Override
      public void rejectedExecution(Runnable r,ThreadPoolExecutor executor){
        if(r instanceof CanceledCallable){
          CanceledCallable cc = ((CanceledCallable)r)
          AsyncContext asyncContext = cc.asyncContext;
          if(asyncContext != null){
            try{
              ServletRequest req = asyncContext.getRequest();
              String uri = (String)req.getAttribute("uri");
              Map params = (Map)req.getAttribute("params");
              LOG.error("async request rejected,uri:{},params{}",uri,JSONUtils.toJSON(params));
            }catch(Exception e){}
            try{
              HttpServletResponse resp = (HttpServletResponse) asynContext.getResponse();
              resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            }finally{
              asyncContext.complete();
            })
          }

        }

      }

    }

  );
  
  if(asyncListener == null){
    asyncListener = new AsyncListener(){
      @Override
      public void onComplete(AsyncEvent event) throws IOException{};
      @Override
      public void onTimeout(AsyncEvent event) throws IOException{
        AsyncContext asyncContext = event.getAsyncContext();
        try{
          ServletRequest req = asyncContext.getRequest();
          String uri = (String) req.getAttribute("uri");
          Map params = (Map)req.getAttribute("params");
          LOG.error("async request timeout,uri:{}",uri,JSONUtils.toJSON(params));
        }catch(){}
        try{
          HttpServletResponse resp = (HttpServletResponse) asyncContext.getResponse();
          resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }finally{
          asyncContext.complete();
        }
      }

      @Override
      public void onError(AsyncEvent event) throws IOException{
       //省略代码error
     }

     @Override
     public void onStartAsync(AsyncEvent event) throws IOException{}
    }

  }

}

4.tomcat 的server.xml配置

<connector port="1601" asyncTimeout="100000"
  acceptCount="10240" maxConnections="10240" acceptorThreadCount="1" minSpareThreads="1"
  maxThreads="1" redirectPort="8443" 
  processorCache="1024" URIEncoding="UTF-8"
  protocol="org.apache.coyote.http11.HttpNioProtocol"
  enableLookups="false"/>
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:12:56  更:2022-03-06 13:13:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:44:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码