当前位置: 首页 > 知识库问答 >
问题:

任务被拒绝由于最大池大小在ThreadPoolExecator

齐才艺
2023-03-14

应用程序已配置Zuul和Eureka将请求路由到后端服务,在我们进行负载测试之前,一切正常。

我开始在负载测试环境中执行10个并发请求,在zuul gateway中出现转发错误,原因是线程池无法为未来的任务分配线程,并拒绝任务,错误如下。

Caused by: java.util.concurrent.RejectedExecutionException: Task 
java.util.concurrent.FutureTask@70fe89b5 rejected from 
java.util.concurrent.ThreadPoolExecutor@25df1748[Running, pool size = 10, 
active threads = 10, queued tasks = 0, completed tasks = 1502]

我的奇迹;在上面的原因中,我看到池大小只有10个,而10个线程是buzy,很实用,因为我连续触发了10个请求。

但是我的corepoolsize应该比我在这里遇到的计数10大得多。是什么导致我的应用程序限制在10个池大小,我可以在我的应用程序中增加corepoolsize和maxpoolsize吗?

共有2个答案

蔡鹏程
2023-03-14

问题是你在使用哪个线程池?您可以在Java中定义各种ExecutorServices,例如为未知数量的线程定义缓存线程池,这将解决您的问题(我的一个项目的示例代码):

ExecutorService pool = Executors.newCachedThreadPool();
    for(FluentCreate create: creates) {
        pool.execute(()->{
            try {
                create.execute();
            } catch (JiraException | IOException | ParseException | RestException | URISyntaxException e) {
                e.printStackTrace();
            }
        });
    }
pool.shutdown();
pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);

如果你能够预测任务的数量,你可以使用固定的线程池。

Executors.newFixedThreadPool(3);
丌官盛
2023-03-14

根据javadocs,ThreadPoolExecutor可能会出于以下几个原因引发RejectedExecutionException

>

  • 如果请求不能排队,并且不能创建另一个池线程,因为这将超过maxPoolsize

    如果已对执行器调用了shutdown()方法。

    现在你说你正在使用“默认”Java执行器,但有点不清楚你的意思。(如果你告诉我们你是如何获得和使用这个执行器的,就更容易理解你的问题了!)

    但底线是池大小不太可能是您拒绝任务的原因。如果所有工作人员都很忙,任务应该排队。

    但是我看到游泳池只有10个,这在现实生活中是不行的

    在许多现实生活场景中,10个池的大小是可以接受的。但是,如果它不适合您的方案,则应该考虑创建具有较大(或较小)池的执行器。

  •  类似资料:
    • 当我们用来谈论核心池大小和最大池大小之间的区别到底是什么? 可以借助示例来解释吗?

    • 当容器加载时,spring boot HikariCP提供的默认连接池大小是多少? 当然,我使用下面的属性来设置最大cp大小,但是我想知道如果我们在application.properties文件中没有给出任何数字,默认的cp大小是多少。 如果我给出application.properties最大池大小为100,而我只使用20,这会影响我的应用程序性能吗?

    • 在我的ASP. net网站,我有一个连接到SQL服务器快速数据库。有时候我确实会犯很多错误,比如 系统。异常:超时已过期。从池中获取连接之前的超时时间。这可能是因为所有池连接都在使用中,并且达到了最大池大小。 搜索错误后,我发现可能是由于SQL Server连接未关闭。但是我已经正确地使用了SQL Server连接,并且正确地处理了它。我已使用using语句处理连接。在我的应用程序中,我在一天中的

    • 我使用的是SpringBoot2.0。3释放。我想增加HikariCP的最大池大小,默认情况下为10。 我试着在带有 spring.datasource.hikari.maximum-池-大小=200 但是它不起作用,因为在日志中它仍然显示最大池大小为10。 我想改变的原因是,我不知怎么地达到了登台的极限,我不知道是什么原因造成的。

    • 我不断收到任务拒绝错误,即使它成功地完成了任务。 2018-03-27 05:57:37518 454935266[task-scheduler-5]错误o.s.i.handler。LoggingHandler-org。springframework。果心任务TaskRejectedException:Executor[java.util.concurrent。ThreadPoolExecutor

    • 是否可以将最大池大小设置为软限制? 我的意思是,我希望HikariCP最多使用5个连接。但是,当需要第6个连接时,我希望HikariCP创建第6个连接,该连接在我将其返回池后将被销毁。此外,如果HikariCP通知我,由于池中的所有连接都已在使用中,因此创建了一个额外的连接,那就太好了。