这可能有点老问题。我对Jboss环境中的ExecutorService工作感到困惑。我使用了一些示例代码,我使用ExecutorService提交任务,在完成所有操作后,我将关闭执行程序。
我面临的问题是在提交一个请求之后,我在下面的请求中遇到异常。 引起:java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.FutureTask@518ad6a2从java.util.concurrent.ThreadPoolExecutor@72114f80拒绝[关闭,池大小= 1,活动线程= 1,排队tasks = 0,completed tasks = 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环境中调用shutdown?如果我删除它,它接受我的所有请求。我在这里看到的例子只是主要方法。我只是想知道它在实际应用中是如何工作的。
如果我误解了一些概念,请原谅我。
答案 0 :(得分:1)
问题是您关闭了ExecutorService
。因此,任何后续提交的任务都会立即被拒绝。
答案 1 :(得分:1)
我认为你在这里有一些误解。
当您提交给执行人时,通常会收到Future<T>
个对象。如果你需要这样的结果,你将调用Future.get()
,这将阻塞,直到线程池执行你的工作。否则你可以把你的工作留下来执行。
你不会正常关闭执行程序,除非你真的想要关闭它,不接受任何工作,让那些排队等待执行。