Apache Сообщение HttpClient занимает слишком много времени для больших файлов - PullRequest
0 голосов
/ 17 июня 2020

Это загрузка документа в репозиторий документов из старого веб-приложения. Этот код загрузки находится на уровне обслуживания. Все Java (JDK1.7 +).

Мой код загружается с помощью вызова веб-службы SOAP. Поскольку у веб-сервиса была аутентификация NTLM, и я не мог заставить успешно работать ни один стандартный Apache CXF или другие фреймворки.

Следовательно, я использовал javax. xml. soap .SOAPMessage и другие связанные объекты, а также javax. xml .bind.JAXBContext / javax. xml .bind.Marshaller и связанный с сгенерируйте SOAP XML и org. apache .http.client.methods.HttpPost, чтобы отправить сообщение в веб-сервис. Тем не менее, я использовал сгенерированные классы wsdl2 java.

Ниже приведен код. Проблема в том, что пост-операция занимает около 5 минут для содержимого размером 100 МБ. Кроме того, иногда возникает таймаут для файлов размером 200 МБ или более. В CloseableHttpClient.execute (сообщение, контекст) это займет около 5 минут.

Я хотел бы знать, есть ли способ улучшить время (используя некоторые методы в HttpClient framework).

httpClientContextInsert = HttpClientContext.create();
httpClient4Insert = HttpClients.createDefault();

ByteArrayEntity soapMessageAsByteArrayEntity4Document = null;

CreateDocument createDocument = new CreateDocument();
createDocument.setFileExtension(fileExtension);
createDocument.setContent(documentContentBase64s);

SOAPMessage soapMessage = messageFactory.createMessage();
SOAPBody soapBody = soapMessage.getSOAPBody();

// Using JAXB API, marshal the Soap Object
JAXBContext jaxbContext = JAXBContext.newInstance(CreateDocument.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
marshaller.marshal(createDocument, document);

// Marshal the object into the SOAPBody
soapBody.addDocument(document);

// Convert the SOAPMessage into a byte array entity
ByteArrayOutputStream out = new ByteArrayOutputStream();
soapMessage.writeTo(out);
soapMessageAsByteArrayEntity4Document = new ByteArrayEntity(out.toByteArray(), ContentType.APPLICATION_SOAP_XML);

...

HttpPost httpPost4Insert = new HttpPost(serviceAccessURLString);
httpPost4Insert.setEntity(soapMessageAsByteArrayEntity4Document);

httpResponse4Insert = httpClient4Insert.execute(httpPost4Insert, httpClientContextInsert);
StatusLine statusLine = httpResponse4Insert.getStatusLine();
HttpEntity responseHttpEntity = httpResponse4Insert.getEntity();

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...