Это может быть старый вопрос. Я запутался в работе 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? Если я удалю, то он принимает все мои запросы. Пример, который я вижу во всем здесь, - это просто основной метод. Я просто хочу знать, как это работает в реальном приложении.
Простите меня, если меня неправильно поняли некоторые концепции.
Спасибо, Жан, за ваш ответ! У меня это закрытие вызывает проблему в моем случае. Но я запутался тогда, где добавить это закрытие в моем случае. Если я перезапущу свой сервер, снова он будет работать для первого запроса, и эта же проблема будет повторена для последующего запроса. Обязательно ли отключать исполнителя в реальном приложении? Если да, то где именно нам это нужно. Или мы можем использовать альтернативную концепцию объединения. – Mohan