Apache HTTP Java Клиент вызывает преждевременное завершение тела сообщения с разделителями-длинами - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь решить очень загадочную ошибку. У меня есть следующий код, выполняющий HTTP-пост на сервере удаления.

      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));

Ответ составляет ~ 63 МБ, и это происходит только при больших ответах. Когда я запускаю этот код, я получаю следующую ошибку:

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(...), я не могу найти ничего, что могло бы быть истекло. Любая помощь в этом вопросе приветствуется.

...