这个是我这边在生产环境碰到的问题,因为测试环境访问量不是很大,所以就没测出来。也没有压测,如果压测的话也可以轻易的压测出来这个问题,其实它具体的异常如下:

java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@7ed27b0 rejected from java.util.concurrent.ThreadPoolExecutor@70927bf[Running, pool size = 10, active threads = 10, queued tasks = 0, completed tasks = 2671]
	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
	at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
	at com.netflix.hystrix.strategy.concurrency.HystrixContextScheduler$ThreadPoolWorker.schedule(HystrixContextScheduler.java:172)
	at com.netflix.hystrix.strategy.concurrency.HystrixContextScheduler$HystrixContextSchedulerWorker.schedule(HystrixContextScheduler.java:106)

我百度了很长时间都没有找到对应的答案,为此我也特意取了这样一个标题,希望碰到这样问题的朋友能容易看到是怎样解决这个问题的,废话不多说了,直接开始吧!

我能解决这个问题是来源于某个大佬的这篇文章  踩坑 Spring Cloud Hystrix 线程池队列配置 。

大家看了之后肯定就会茅舍顿开的,具体看看上面的文章,这里我这边就直接告诉大家答案了。

我们只需要配置一下 Hystrix 线程池的配置就行了,我这边配置如下:

#并发执行的最大线程数,默认10
hystrix.threadpool.default.coreSize=50 
#BlockingQueue的最大队列数,默认值-1
hystrix.threadpool.default.maxQueueSize=1500 
#即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求也会被拒绝,默认值5
hystrix.threadpool.default.queueSizeRejectionThreshold=1000

注意:如果要调整队列,必须同时修改maxQueueSize和queueSizeRejectionThreshold属性的值,否则都会出现异常!因为queueSizeRejectionThreshold 官方的默认值只有5。

GitHub 加速计划 / th / ThreadPool
7.74 K
2.22 K
下载
A simple C++11 Thread Pool implementation
最近提交(Master分支:2 个月前 )
9a42ec13 - 9 年前
fcc91415 - 9 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐