应用程序已将Zuul和Eureka配置为将请求路由到后端服务,并且一切正常,直到我们进行负载测试为止。
我开始在我们的负载测试环境中执行10个并发请求,并在zuul网关中收到转发错误,原因是线程池无法为将来的任务分配线程并拒绝任务,且出现以下错误。
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个线程很忙,这很实用,因为我连续发出了10个请求。
但是我的corepoolsize应该比我在这里遇到的10大得多。是什么导致我的应用程序限制为10个池大小,我可以在我的应用程序中增加corepoolsize和maxpoolsize吗?
答案 0 :(得分:1)
问题是您正在使用哪个ThreadPool? 您可以使用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);
答案 1 :(得分:1)
根据Javadocs,出于某些原因,ThreadPoolExecutor可能引发RejectedExecutionException
:
如果无法将请求放入队列中,并且无法创建另一个池线程,因为这将超出maxPoolSize
。
如果已经在执行程序上调用了shutdown()
方法。
现在,您说您正在使用“默认的” Java执行程序,但是您不清楚这是什么意思。 (如果您向我们展示了如何获取和使用该执行器,那么更容易理解您的问题!)
但是最重要的是,池大小不太可能是导致任务被拒绝的原因。如果所有工作人员都很忙,则应将任务 排队。
但是我看到池的大小只有10个,在实际的[生活]场景中,这是不可行的
在许多现实生活中,池大小为10很好。但是,如果它不适合您的情况,则应考虑创建一个具有更大(或更小)池的执行程序。