对于大文件,Apache HttpClient发布花费的时间太长

时间:2020-06-17 19:48:49

标签: httpclient

这是从旧的Web应用程序上载到文档存储库中的文档。此上载代码在服务层中。所有Java(JDK1.7 +)。

我的代码是通过调用SOAP Web服务上载的。 由于Web服务具有NTLM身份验证,因此我无法获得任何标准的Apache CXF或其他框架来成功工作。

因此,我使用javax.xml.soap.SOAPMessage和其他相关对象,并使用javax.xml.bind.JAXBContext / javax.xml.bind.Marshaller和与之相关的SOAP XML和org.apache.http。 client.methods.HttpPost将消息发布到Web服务。 尽管如此,我还是使用wsdl2java生成的类。

以下是代码。 问题是,对于大小为100 MB的内容,后期操作将花费近5分钟。此外,对于大小为200MB或更大的文件,有时似乎会发生超时。在CloseableHttpClient.execute(发布,上下文)处,大约需要5分钟。

我想知道是否有任何方法可以改善时间(通过使用HttpClient框架中的某些技术)。

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

...

0 个答案:

没有答案