首页 > 解决方案 > 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(...),所以我找不到任何可能超时的东西。对此问题的任何帮助表示赞赏。

标签: javahttpinputstreamapache-httpclient-4.x

解决方案


推荐阅读