Java:ExecutorService:newFixedThreadPool

时间:2016-01-29 17:01:57

标签: java multithreading rest jboss

这可能有点老问题。我对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?如果我删除它,它接受我的所有请求。我在这里看到的例子只是主要方法。我只是想知道它在实际应用中是如何工作的。

如果我误解了一些概念,请原谅我。

2 个答案:

答案 0 :(得分:1)

问题是您关闭了ExecutorService。因此,任何后续提交的任务都会立即被拒绝。

答案 1 :(得分:1)

我认为你在这里有一些误解。

当您提交给执行人时,通常会收到Future<T>个对象。如果你需要这样的结果,你将调用Future.get(),这将阻塞,直到线程池执行你的工作。否则你可以把你的工作留下来执行。

你不会正常关闭执行程序,除非你真的想要关闭它,不接受任何工作,让那些排队等待执行。