Spring Boot中使用Feign调用时could not be queued for execution and no fallback available以及RejectedExecution

仅供参考(本人也是一知半解,自己还在混乱中,写这个也只是记录一下)
先上报错
Spring Boot中使用Feign调用时could not be queued for execution and no fallback available以及RejectedExecution_第1张图片
Spring Boot中使用Feign调用时could not be queued for execution and no fallback available以及RejectedExecution_第2张图片

其实还是很好懂的,不就是提交的任务被线程池拒绝了。但要怎么解决呢?en…en…

那我们来一起了解下线程池。

首先记住以下参数:

1. corePoolSize:核心线程数大小:不管它们创建以后是不是空闲的。线程池需要保持 corePoolSize 数量的线程,除非设置了 allowCoreThreadTimeOut。
2. maximumPoolSize:最大线程数:线程池中最多允许创建 maximumPoolSize 个线程
3. keepAliveTime:存活时间:如果经过 keepAliveTime 时间后,超过核心线程数的线程还没有接受到新的任务,那就回收。
4. unit:存活时间的时间单位。
5. workQueue:存放待执行任务的队列:当提交的任务数超过核心线程数大小后,再提交的任务就存放在这里。这个队列将只保存方法Runnable 提交的任务execute。
6. threadFactory:线程工程:用来创建线程工厂。
7. handler :拒绝策略;当队列里面放满了任务、最大线程数的线程都在工作时,这时继续提交的任务线程池就处理不了,应该执行怎么样的拒绝策略。

在上面的参数中,我们主要需要关注的是corePoolSize、maximumPoolSize、workQueue。具体怎么使用呢,接着往下看。

当然如果英文好的,可以自己看下文档,可以更深入的了解ThreadPoolExecutor。

咳咳,来啦,划重点!!!

任务调度是线程池的主要入口,当用户提交了一个任务,接下来这个任务将如何执行都是由这个阶段决定的。了解这部分就相当于了解了线程池的核心运行机制。

废话不多说,来,上图。
Spring Boot中使用Feign调用时could not be queued for execution and no fallback available以及RejectedExecution_第3张图片
哇!感觉懂了,又感觉没懂,好高级的样子有没有,来继续。

任务缓冲: 任务缓冲模块是线程池能够管理任务的核心部分。线程池的本质是对任务和线程的管理,而做到这一点最关键的思想就是将任务和线程两者解耦,不让两者直接关联,才可以做后续的分配工作。线程池中是以生产者消费者模式,通过一个阻塞队列来实现的。阻塞队列缓存任务,工作线程从阻塞队列中获取任务。

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。

这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。

阻塞队列成员有:Spring Boot中使用Feign调用时could not be queued for execution and no fallback available以及RejectedExecution_第4张图片
en…不明觉厉!

任务申请:
任务的执行有两种可能

  1. 任务直接由新创建的线程执行。
  2. 线程从任务队列中获取任务然后执行,执行完任务的空闲线程会再次去从队列中申请任务再去执行。

第一种情况仅出现在线程初始创建的时候,第二种是线程获取任务绝大多数的情况。线程需要从任务缓存模块中不断地取任务执行,帮助线程从阻塞队列中获取任务,实现线程管理模块和任务管理模块之间的通信。

别停,继续。。。

任务拒绝:任务拒绝模块是线程池的保护部分,线程池有一个最大的容量,当线程池的任务缓存队列已满,并且线程池中的线程数目达到maximumPoolSize时,就需要拒绝掉该任务,采取任务拒绝策略,保护线程池。

终于等到你,还好我没放弃,幸福来得好不容易,才会让人更加珍惜。看到曙光了有没有,我们的错是什么? RejectedExecutionException

JDK提供的四种已有拒绝策略,其特点如下:
Spring Boot中使用Feign调用时could not be queued for execution and no fallback available以及RejectedExecution_第5张图片
其实就是线程池满了,没有线程执行任务了,网上也都给出了答案,就是修改coreSize、maximumSize 、maxQueueSize的大小,感兴趣的小伙伴可以自己调整值测试下。

最后,推荐观看https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html

你可能感兴趣的:(java)