Java : ExecutorService : newFixedThreadPool

标签 java multithreading rest jboss

这可能是一个有点老的问题。我对 Jboss 环境中的 ExecutorService 工作感到困惑。我使用了一些示例代码,其中我使用 ExecutorService 提交任务,一切完成后我关闭执行程序。

我面临的问题是提交一个请求后,后续请求出现以下异常。 原因:java.util.concurrent.RejectedExecutionException:任务 java.util.concurrent.FutureTask@518ad6a2 被 java.util.concurrent.ThreadPoolExecutor@72114f80 拒绝[正在关闭,池大小 = 1, Activity 线程 = 1,已排队任务 = 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环境下真的需要调用shutdown吗?如果我删除它,它就接受我的所有请求。我在这里看到的示例只是主要方法。我只是想知道它在实际应用中是如何工作的。

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

最佳答案

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

关于Java : ExecutorService : newFixedThreadPool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35090039/

相关文章:

java - 在 Java 中删除字符串中第一个单词的最佳方法

Java Swing [JDialog]

java - Postman 和 RestTemplate 的 API 调用中的主体参数相同,但只有 Postman 有效

c# - 返工 EventWaitHandle 以异步等待信号

java - 从java访问全局C变量

c++ - 为什么 OpenMP 程序只在一个线程中运行

xml - 海康威视日志搜索 REST API(POST 方法)给出无效的 XML 格式

java - 在android中将值插入到sqlite数据库中

rest - TOAuth2验证器 : How do i refresh an expired token?

java - 微服务架构中的错误源传播