一. 前言

在开发SpringCloud项目架构的项目时,服务与服务之间的调用通过Feign客户端实现,在做一个从Feign客户端到service服务端的POST请求时,Feign客户端为服务消费者觉得,service服务端为服务提供者角色,提供者角色中service服务端Controller类中方法测试正常,但却在Feign客户端返回时报错,大致异常如下:

Caused by: java.io.IOException: Incomplete output streamat sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1523)at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)at feign.Client$Default.convertResponse(Client.java:152)at feign.Client$Default.execute(Client.java:74).........................................

二. 分析异常

关键异常: IOException: Incomplete output stream, 从表面意思看,是IO异常,异常信息也是从Feign客户端源码报出来的,这样一步一步锁定异常范围,根据异常调用链得知最终异常出现的地方是:sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1523)
HttpURLConnection.getInputStream0方法1523行。经过搜索资料,原来feign采用jdk原生HttpURLConnection向下游服务发起http请求(源码详见feign.Client.Default),先到getInputStream0方法看看:

 private synchronized InputStream getInputStream0() throws IOException {if(!this.doInput) {throw new ProtocolException("Cannot read from URLConnection if doInput=false (call setDoInput(true))");} else if(this.rememberedException != null) {if(this.rememberedException instanceof RuntimeException) {throw new RuntimeException(this.rememberedException);} else {throw this.getChainedException((IOException)this.rememberedException);}} else if(this.inputStream != null) {return this.inputStream;} else {if(this.streaming()) {if(this.strOutputStream == null) {this.getOutputStream();}this.strOutputStream.close();if(!this.strOutputStream.writtenOK()) {   throw new IOException("Incomplete output stream"); // 1523行}}..........// this.strOutputStream.writtenOK()方法boolean writtenOK() {return this.closed && !this.error;}

看起来,this.error是true导致的,也就是说在OutputStream写入流时出错。

三. 解决方案

1. 加feign-httpclient依赖

没办法,只能用Apache HttpClient替换掉原生HttpURLConnection。加入依赖:

<!-- 使用Apache HttpClient替换Feign原生httpclient -->
<!-- feign-httpclient内含Apache HttpClient --><dependency><groupId>com.netflix.feign</groupId><artifactId>feign-httpclient</artifactId><version>8.17.0</version></dependency>

2. 开启Feign支持httpclient

然后在application.yml中添加如下:

feign:httpclient:enabled: true

再次重新调用,一切恢复正常。

3. 补充

引入Apache HttpClient包时,需要注意指定Content-Type,不然会产生以下异常:

Caused by: java.lang.IllegalArgumentException: MIME type may not contain reserved characters

解决办法 :

@RequestMapping(value = "/getUser", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE)

注解中指定: Content-Type 即 指定 consumes 的属性值

4. 其他异常情况

如果你又遇到了下面这个异常,可参考我对网友提出的问题回复的帖子,按照对应的依赖版本匹配上即可解决问题:openfeign里面配置httpclient出错。

异常日志如下:

Caused by: java.lang.NoSuchMethodError: feign.Response.create(ILjava/lang/String;Ljava/util/Map;Lfeign/Response$Body;)Lfeign/Response;

Caused by: java.lang.NoSuchMethodError: feign.Response.create(ILjava/lang/String;Ljava/util/Map;Lfeign/Response$Body;)Lfeign/Response;

网友的提问点醒了我:

然后我的解决方式:

四. 参考

参考: https://www.jianshu.com/p/6397e2cd1fae

Feign客户端异常IOException: Incomplete output stream解决方案相关推荐

  1. java.io.IOException: Incomplete output stream

    Feign客户端请求异常,服务端无异常 错误信息: java.io.IOException: Incomplete output streamat sun.net.www.protocol.http. ...

  2. Spring调用Feign报错:java.io.IOException: Incomplete output stream

    报错内容 翻译了一下: 进行Feign调用片段: Feign内容: 执行到调用Feign时就报错了,设置断点调试发现根本就没有加入到调用的微服务中 但是Feign对象获取到了 浏览器端显示: 显示调用 ...

  3. nested exception is feign.RetryableException: Incomplete output stream executing POST http://

    一.背景 SpringCloud微服务框架中使用OpenFeign做服务间调用时(入参为@ResponseBody标注的JavaBean,请求类型为POST),被调用方正常执行,调用方报错,报错信息如 ...

  4. openfeign 转发post 接口 错误 Incomplete output stream executing POST http://xxxx

    openfeign 转发post 接口 错误 Incomplete output stream executing POST http://xxxx 问题描述 当采用feign转发 post请求时,报 ...

  5. javax异常: javax.imageio.IIOException: Can't create output stream解决方法

    验证码工具类: 1 package com.newcapec.utils; 2 3 import com.sun.image.codec.jpeg.JPEGCodec; 4 import com.su ...

  6. Could not close the output stream for file hdfs://192.168.190.129:9000/BJ_4.c

    在使用kettle从windows客户端向hadoop集群传输文件的过程中,如下: 报这样的错误,文件上传成功,但是没有写入数据. 2017/04/12 15:32:08 - Hadoop Copy ...

  7. 客户端异常断网断电,服务端该如何感知?

    本文只针对于web项目.开始想的是使用websocket进行长连接服务,但有个问题就来了,客户端异常断电.异常断网,比如说我现在把电脑炸了,网线掐了,服务端是不知道的,所以无法触发oncolse方法, ...

  8. Redis常见客户端异常汇总

    一.无法从连接池获取到连接 JedisPool中的Jedis对象个数是有限的,默认是8个.这里假设使用的默认配置,如果有8个Jedis对象被占用,并且没有归还,如果调用者还要从JedisPool中借用 ...

  9. 飞车老显示pvp服务器断开连接,lol客户端出现PVP.net断开临时解决方案公告

    原标题:lol客户端出现PVP.net断开临时解决方案公告 lol客户端出现PVP.net断开临时解决方案公告 最近很多玩家反映在游戏平台左上角弹出了"PVP.net断开"的提示, ...

最新文章

  1. C#中提示:当前上下文中不存在名称“ConfigurationManager”
  2. 在已有SQL 2005 Server 群集中添加节点
  3. Android中设置文本颜色的三种方法
  4. 类间关系有很多种 UML
  5. zendframework Form表单美化
  6. java 获取全球国家名称,语言,简称
  7. 单个像素代表的实际物理尺寸
  8. 可测函数积分的进一步性质
  9. Android高级UI系列教程(二)
  10. H264视频通过RTMP直播 .
  11. 【uniapp】将uni-app开发的安卓程序运行到雷电模拟器上进行调试
  12. Flink 网络流控和反压剖析详解
  13. 【生产力工具】Surfingkeys——网页版Vim
  14. Csharp零基础:第一天学Csharp要会的基础知识
  15. mousedown mouseup click 触发顺序
  16. 读取身份证信息系统的程序编写
  17. C#调用usb摄像头的实现方法
  18. 整数规划学习笔记(一)
  19. java 经纬度计算_java 实现经纬度计算
  20. 【SAP Abap】SAP第四代增强开发DEMO

热门文章

  1. 深度学习: ground truth 解释
  2. 如何使用Photoshop(PS)将图片的底色变为透明
  3. CSS实现div填满剩余高度
  4. 【Android】Android开源项目分类汇总
  5. Python入门程序
  6. HTML 篮球比赛计时记分器
  7. strtotime 用法
  8. linux命令大全——文件编辑相关指令
  9. python中open()函数里中文处理
  10. idea提交git报401错误解决办法