javax.xml.soap.MessageFactory.createMessage 大内容调用时间过长
javax.xml.soap.MessageFactory.createMessage call takes too long for large content
http响应内容为100mb内容的soap消息。
messageFactory.createMessage(空,响应输入流)
需要 3 到 4 分钟,并且
responseSoapMessage.getSOAPBody()
需要另外 4 分钟或更长时间。
之后,由于我在WildFly应用服务器,交易超时。
MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
...
HttpEntity responseHttpEntity = httpResponse.getEntity();
...
InputStream responseContentStream = responseHttpEntity.getContent();
SOAPMessage responseSoapMessage = messageFactory.createMessage(null, responseContentStream);
SOAPBody responseSoapBody = responseSoapMessage.getSOAPBody();
在通过 MessageFactory 从 InputStream 创建 SOAPMessage 时,我想知道为什么要花这么长时间。
可能是由于某些 JAR 问题?
我有两个 JARS 在玩:axis-1.4.jar,和 saaj-impl-1.3.jar
然而,在调试时,我发现使用的 class 是来自 saaj-impl-1.3.jar.
的 SOAPMessageFactory1_2Impl
不过,我仍然无法理解为什么跨过这两行代码需要 5 分钟以上的时间。
这是响应 InputStream 中的 SOAP XML。
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ReceiveDocumentResponse xmlns="https://NAMESPACEURL">
<ReceiveDocumentResult>
<base64Binary>HERE IS THE JPG IMAGE CONTENT OF SIZE 100 MB OR MORE</base64Binary>
</ReceiveDocumentResult>
</ReceiveDocumentResponse>
</soap:Body>
</soap:Envelope>
请注意对于小于 30 MB 的内容,此方法调用工作相当好(快速)。
非常感谢有关故障排除的任何提示,或任何用于解析内容的替代方法的提示
我用下面的内容替换了上面的逻辑。 100 MB 的内容确实需要一分钟左右的时间,但它始终如一。
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder domParser = null;
domParser = builderFactory.newDocumentBuilder();
domDocument = domParser.parse(responseContentStream);
NodeList elementList = domDocument.getElementsByTagName("base64Binary");
Node element = elementList.item(0);
String base64String = element.getTextContent();
byte[] rawData= Base64.getDecoder().decode(base64String);
document.setBData(rawData);
不管是什么...
http响应内容为100mb内容的soap消息。
messageFactory.createMessage(空,响应输入流) 需要 3 到 4 分钟,并且 responseSoapMessage.getSOAPBody() 需要另外 4 分钟或更长时间。 之后,由于我在WildFly应用服务器,交易超时。
MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
...
HttpEntity responseHttpEntity = httpResponse.getEntity();
...
InputStream responseContentStream = responseHttpEntity.getContent();
SOAPMessage responseSoapMessage = messageFactory.createMessage(null, responseContentStream);
SOAPBody responseSoapBody = responseSoapMessage.getSOAPBody();
在通过 MessageFactory 从 InputStream 创建 SOAPMessage 时,我想知道为什么要花这么长时间。
可能是由于某些 JAR 问题? 我有两个 JARS 在玩:axis-1.4.jar,和 saaj-impl-1.3.jar
然而,在调试时,我发现使用的 class 是来自 saaj-impl-1.3.jar.
的 SOAPMessageFactory1_2Impl不过,我仍然无法理解为什么跨过这两行代码需要 5 分钟以上的时间。
这是响应 InputStream 中的 SOAP XML。
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ReceiveDocumentResponse xmlns="https://NAMESPACEURL">
<ReceiveDocumentResult>
<base64Binary>HERE IS THE JPG IMAGE CONTENT OF SIZE 100 MB OR MORE</base64Binary>
</ReceiveDocumentResult>
</ReceiveDocumentResponse>
</soap:Body>
</soap:Envelope>
请注意对于小于 30 MB 的内容,此方法调用工作相当好(快速)。
非常感谢有关故障排除的任何提示,或任何用于解析内容的替代方法的提示
我用下面的内容替换了上面的逻辑。 100 MB 的内容确实需要一分钟左右的时间,但它始终如一。
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder domParser = null;
domParser = builderFactory.newDocumentBuilder();
domDocument = domParser.parse(responseContentStream);
NodeList elementList = domDocument.getElementsByTagName("base64Binary");
Node element = elementList.item(0);
String base64String = element.getTextContent();
byte[] rawData= Base64.getDecoder().decode(base64String);
document.setBData(rawData);
不管是什么...