当前位置: 首页 > 知识库问答 >
问题:

请求完成时如何获取会话

穆旭尧
2023-03-14

当我的请求出现在我的控制器上,executorService创建一个线程池并创建一些线程来执行某些逻辑时,我的请求返回到Browser。我的问题从这里开始,运行在服务器端的线程需要session对象,线程得到的session为null。下面是代码,请给出一些合适的解决方案,这样我就可以在请求完成后得到会话值。

@RequestMapping(值=“/expandAllController”,方法=RequestMethod.Post)public@ResponseBody void expandAllController(@RequestParam final String[]controllerList,final HttpServletRequest请求){

     int listSize=controllerList.length;
     BlockingQueue controllerDataQueue=cacheUtility.initBlockingQueue(listSize);
     ExecutorService executor=Executors.newCachedThreadPool();
     for(String controllerID:controllerList){
     executor.submit(new producer(controllerID,request,controllerDataQueue));
     }
     executor.shutdown();
     try {
        executor.awaitTermination(10, TimeUnit.MINUTES);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

     // data fetching Thread 


}

private class producer implements Runnable{

    Object responseObj=null;
    String controllerID;
    HttpServletRequest request;
    BlockingQueue controllerDataQueue;
          producer(String controllerID ,HttpServletRequest request, BlockingQueue controllerDataQueue ){
              this.controllerDataQueue=controllerDataQueue;
              this.controllerID=controllerID;
              this.request=request;
          }
         @Override
            public void run() {
                int ThreadCount=0;
                final HttpSession session = request.getSession();
    final CommonSettings commonSettings = CommonSettings
            .getInstance(session);
                    // for(String controllerID:controllerList){
                         controllerData.setControllerId(controllerID);

                         responseObj=expandController(controllerData,session);
                         if(responseObj!=null){
                             try {
                                controllerDataQueue.put(responseObj);

                                ThreadCount++;
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                         }

                     }
                }

共有1个答案

步炯
2023-03-14

直接从controller方法在会话中存储一个空容器(例如,同步的集或列表),然后将此容器传递给每个任务,并使任务将它们的响应添加到容器中。

另外,考虑重用始终相同的线程池。总是开始一个新的是浪费资源。如果有太多的请求进入,那么并行运行的线程数量就会太多,而这正是线程池所要避免的。

 类似资料:
  • 本文向大家介绍php如何获取Http请求,包括了php如何获取Http请求的使用技巧和注意事项,需要的朋友参考一下 php获取Http请求的方法 $_SERVER介绍 $_SERVER是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。 获取Http请求的方法示例 实例补充: socket方式 使用套接字建立连接,拼接 HTTP

  • 我目前是Jmeter的新手,正在尝试创建一个Jmeter脚本来测试处理和完成请求所需的时间。 a)使用令牌进行身份验证-完成b)发送请求-完成-返回200 c)获取请求-部分完成 C:我正试图得到能够监控这个请求,以找出它什么时候完成,失败等等。 我从研究JSR223采样器开始,但想看看是否有更好更简单的方法来实现这一点。 列表sendGet(字符串url,map 正文){

  • 我需要帮助如何在我的服务器(index.js)中正确编写GET和POST请求,以及如何在应用程序中正确编写fetch。js。 我阅读了Stackoverflow上的线程,并搜索了有关如何编写请求和获取的信息,但我发现如何将示例添加到自己的代码中非常困难。我已经尝试了三个星期不同的解决方案,但都一事无成。所以,请帮忙。我觉得这应该没那么难,但出于某种原因确实如此。除了这里,我没有人需要帮助。 我正在

  • 是否有办法获得请求。要求要求一场在图像的层次结构中看到的属性?我尝试了以下方法: <代码>对象值=请求。getAttribute(“Travis”) 和

  • 问题内容: 在Bash中,可以通过追加在后台执行命令。如何在Python中完成? 问题答案: 我用。我在模块级别创建一个单例线程池,然后用于启动任务。 该命令给了我一个未来,我可以将它无限期地与其他未来添加到列表中,直到我想收集全部或部分结果为止。 出于所有逻辑和理由,是一个THREAD池而不是一个进程池。 示例(只要安装了请求,就可以在Python 2和3中使用): 这些请求将同时执行,因此运行

  • 早上好 是否有办法获得请求。要求要求一场在图像的层次结构中看到的属性?我尝试了以下方法: <代码>对象值=请求。getAttribute(“Travis”) 以及