java - Apache HTTP Java 客户端导致内容长度分隔的消息正文过早结束
问题描述
我正在尝试解决一个非常令人费解的错误。我有以下代码执行到删除服务器的 HTTP Post。
httpPost.setEntity(new StringEntity(requestAsString));
HttpResponse httpResponse = httpClient.execute(httpHost, httpPost);
Arrays.asList(httpResponse.getAllHeaders()).stream().forEach(header -> System.out.println(header.getName() + " : " + header.getValue()));
Thread.sleep(10_000);
List<DataRecord> value = Arrays.asList(objectMapper.readValue(httpResponse.getEntity().getContent(), DataRecord[].class));
响应约为 63Mb,这只发生在较大的响应中。当我运行此代码时,我收到以下错误:
com.fasterxml.jackson.databind.JsonMappingException: Premature end of Content-Length delimited message body (expected: 63476765; received: 404420 (through reference chain: java.lang.Object[][1189])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:391)
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:363)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:206)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:21)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4001)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3058)
at com.company.Class1.queryData(Class1.java:74)
... 5 more
Caused by: org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body (expected: 63476765; received: 404420
at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:178)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:135)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._loadMore(UTF8StreamJsonParser.java:205)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._parseFloat(UTF8StreamJsonParser.java:1524)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._parsePosNumber(UTF8StreamJsonParser.java:1363)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextFieldName(UTF8StreamJsonParser.java:1025)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer._readAndBind(MapDeserializer.java:448)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:367)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:29)
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:136)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:195)
但是,如果我删除,则不会发生此错误
Thread.sleep(10_000);
如果问题是客户端没有从服务器获得完整的响应,我希望看到问题存在,即使我在那里没有线程睡眠。Thread.sleep(...)
如果我将时间缩短到 5 秒,这个问题也会消失。似乎这是一个时间问题,但由于我HttpResponse
在调用之前已经有了对象Thread.sleep(...)
,所以我找不到任何可能超时的东西。对此问题的任何帮助表示赞赏。
解决方案
推荐阅读
- if-statement - 基于右侧和上方单元格值的单元格总和
- unit-testing - Unittest:如何在类中设置属性
- php - 为什么 zip 文件夹不是用 PHP 创建的
- android - 如何录制实时流媒体视频,从 SurfaceView 捕获照片并将其保存在手机内部存储中
- php - Php GraphQL 实现响应比 REST 慢
- sql - BigQuery SQL 从具有多个站点的位置数据跟踪兴趣点的停留时间
- java - 如何在 android 中使用 firebase 打开聊天活动时停止显示通知?
- excel - 发送 Tab 按钮按键事件 10 次并循环递增 1
- react-native - 使用 react-router-dom 或标签React-Redirect 到外部链接
- python - 无法使用python自动点击mac