2013-07-18 4 views
0

Когда мой запрос поступает на мой контроллер, executorService создает threadpool и создает некоторые потоки для выполнения некоторой логики, мой запрос возвращается в браузер. Моя проблема начинается здесь, потоки, которые работают на стороне сервера, требуют объекта сеанса, потоки получают сеанс как null. какой подход я использую для установки значения сеанса после ответа возвращается к clientide.Bowow это код, пожалуйста, дайте некоторое подходящее решение, так что я могу получить значение сеанса после завершения запроса.Как получить сеанс, когда запрос завершен

@RequestMapping (значение = "/ expandAllController", метод = RequestMethod.POST) общественных @ResponseBody недействительными expandAllController (@RequestParam окончательного String [] controllerList, окончательный запрос 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(); 
          } 
         } 

        } 
       } 
+0

Простите, пожалуйста, прочитайте и изучите некоторые основы Java, прежде чем вы захотите сделать что-то подобное. Ваш код ужасен. – sk2212

+0

, то, пожалуйста, предложите исправительное решение. – Sapu

ответ

0

хранить пустой контейнер (синхронизированный набор или список, например) в сеансе непосредственно из метода контроллера, затем передайте этот контейнер в каждую из задач и заставьте задачи добавить свой ответ в контейнер.

Кроме того, рассмотрите возможность повторного использования одного и того же пула потоков. Он тратит ресурсы, чтобы всегда начинать новый. И если приходит слишком много запросов, у вас будет слишком большое количество потоков, работающих параллельно, что и используется для предотвращения пула потоков.

+0

Не могли бы вы упростить первый пункт больше ... это поможет мне много ... спасибо заранее. – Sapu

+0

В вашем контроллере выполните 'Set ответы = Collections.synchronizedSet (новый HashSet ()); session.setAttribute («ответы», ответы); '. Теперь передайте этот набор, а не запрос, всем вашим задачам. И в своей задаче добавьте ответ на набор: 'response.add (theResponse);'. Вуаля. Все ответы находятся в сеансе. –

+0

Спасибо, ты отличный. – Sapu

Смежные вопросы