2016-01-29 2 views
1

Это может быть старый вопрос. Я запутался в работе ExecutorService в среде Jboss. Я использовал некоторый пример кода, где я отправляю задачу с помощью ExecutorService, и после того, как все сделано, я завершаю работу исполнителя.Java: ExecutorService: newFixedThreadPool

Проблема, перед которой я столкнулся, после отправки одного запроса, я получаю ниже исключения для последующего запроса. Вызвано: java.util.concurrent.RejectedExecutionException: Задача [email protected] отклонено из [email protected] [Shutdown, pool size = 1, active threads = 1, queued tasks = 0, завершенные задачи = 0]

ExecutorService executorService = Executors.newFixedThreadPool(3); 

@POST 
@Path("/request") 
public Response checkAsync(final MultiMedia multiMedia) { 
    final Random rand = new Random(); 
    final String random = String.valueOf(rand.nextInt(50) + 1); 

    multiMediaJobs.put(random, multiMedia); 

    final String jobId = "{ 'jobId' : " + random + "}"; 

    executorService.submit(new Runnable() { 
      @Override 
      public void run() { 
       boolean result = veryExpensiveOperation(jobId); 
       if (result) { 
        try { 
         MultiMedia multiMedia = (MultiMedia) multiMediaJobs.get(random); 
         multiMedia.getMediadata().getMetadata() 
            .setAssetId(random); 

         final String uri = multiMedia.getCallback().getUri()+multiMedia.getCallback().getResource(); 

         RestTemplate restTemplate = new RestTemplate(); 
         String code = restTemplate.postForObject(uri, 
           multiMedia, String.class); 

         System.out.println(code); 
        } finally { 
         logger.debug("Map size: " + multiMediaJobs.size()); 
         logger.debug("Time: "+System.currentTimeMillis()); 
         multiMediaJobs.remove(random); 
        } 
       } 
      } 

      private boolean veryExpensiveOperation(String jobId) { 
       try { 
        Thread.sleep(7000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       logger.debug("Task is processed fully"); 

       return true; 
      } 
     }); 

    executorService.shutdown(); 
    try { 
     executorService.awaitTermination(1, TimeUnit.SECONDS); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return Response.status(Status.ACCEPTED) 
        .entity(commonHelper.toJSON(jobId)).build(); 
} 

ли это действительно необходимо вызвать остановку в среде JBOSS? Если я удалю, то он принимает все мои запросы. Пример, который я вижу во всем здесь, - это просто основной метод. Я просто хочу знать, как это работает в реальном приложении.

Простите меня, если меня неправильно поняли некоторые концепции.

ответ

1

Думаю, у вас есть некоторые недоразумения здесь.

Когда вы отправляете исполнителю, вы обычно получаете объект Future<T>. Если вам нужен результат, вы вызовете Future.get(), и это будет заблокировано до тех пор, пока threadpool не выполнит вашу работу. В противном случае вы можете просто оставить свои задания для выполнения.

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

1

Проблема в том, что вы отключили ExecutorService. Таким образом, любая последующая задача представляется незамедлительно.

+0

Спасибо, Жан, за ваш ответ! У меня это закрытие вызывает проблему в моем случае. Но я запутался тогда, где добавить это закрытие в моем случае. Если я перезапущу свой сервер, снова он будет работать для первого запроса, и эта же проблема будет повторена для последующего запроса. Обязательно ли отключать исполнителя в реальном приложении? Если да, то где именно нам это нужно. Или мы можем использовать альтернативную концепцию объединения. – Mohan

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