javax. xml. soap .MessageFactory.createMessage вызов занимает слишком много времени для большого содержимого - PullRequest
0 голосов
/ 18 июня 2020

Содержимое HTTP-ответа - это сообщение soap с содержимым 100 МБ.

messageFactory.createMessage (null, responseinputstream) занимает от 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();

При создании SOAPMessage из InputStream через MessageFactory, мне интересно, почему это занимает так много времени.

Может это из-за какой-то проблемы с JAR? У меня в игре два JARS: axis-1.4.jar и saaj-impl-1.3.jar

Однако во время отладки я обнаружил, что используемый класс - SOAPMessageFactory1_2Impl из saaj-impl-1.3.jar.

Тем не менее, я не мог понять, почему требуется больше 5 минут, чтобы пересечь эти две строки кода.

Это SOAP XML в ответе InputStream.

<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 МБ.

Любые советы go по устранению неполадок или любые советы go по альтернативному подходу к синтаксическому анализу содержимого очень приветствуются

1 Ответ

0 голосов
/ 23 июня 2020

Я заменил логи c выше на то, что ниже. Для содержимого 100 МБ требуется около минуты, но он работает стабильно.

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

Что бы это ни было ...

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