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

仅供参考(本人也是一知半解,自己还在混乱中,写这个也只是记录一下)
先上报错
报错
报错

其实还是很好懂的,不就是提交的任务被线程池拒绝了。但要怎么解决呢?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。

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

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

废话不多说,来,上图。
任务调度
哇!感觉懂了,又感觉没懂,好高级的样子有没有,来继续。

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

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

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

阻塞队列成员有:阻塞队列
en…不明觉厉!

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

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

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

别停,继续。。。

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

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

JDK提供的四种已有拒绝策略,其特点如下:
拒绝策略
其实就是线程池满了,没有线程执行任务了,网上也都给出了答案,就是修改coreSize、maximumSize 、maxQueueSize的大小,感兴趣的小伙伴可以自己调整值测试下。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
出现异常"could not extract response: no suitable httpclient found for response type"通常是由于open-feign微服务间调用,没有找到合适的http客户端来处理返回的响应类型引起的。 在使用open-feign进行微服务间调用,我们需要根据实际情况选择适合的http客户端来处理响应。通常open-feign会自动进行http客户端的选择和配置,但有些情况下可能会出现上述异常。 解决该异常的方法有以下几种: 1. 确保引入了适当版本的open-feign和相关依赖库。要使用open-feign,应该在pom.xml文件添加相应的依赖,并确保其版本与当前使用spring boot版本兼容。 2. 检查http客户端的配置。可以通过修改application.properties或application.yml文件设置http客户端的配置。例如,在application.properties文件添加以下配置: ``` feign.httpclient.enabled=true feign.okhttp.enabled=false ``` 这将启用Apache HttpClient并禁用OkHttp客户端。 3. 如果仍然出现异常,可以尝试清除本地maven仓库并重新构建项目。有候这种异常是由于maven仓库缓存的库与实际所需版本不一致引起的。 总的来说,解决open-feign微服务间调用异常"could not extract response: no suitable httpclient found for response type"的方法是确保使用了适当的open-feign版本,并根据需要调整http客户端的配置。如果仍然出现异常,可以尝试清除maven仓库并重新构建项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值