How to convert a string to a SOAPMessage in Java?

前端 未结 6 925
轻奢々
轻奢々 2020-12-23 21:38

I wonder is there any way to convert a string to SOAPMessage?

Let me say I have a string as follows:

String send = "

        
6条回答
  •  别那么骄傲
    2020-12-23 22:03

    I've measured feeding SOAPMessage with SAXSource to be about 50% faster than internal SAAJ parsing implementation used in the accepted answer:

    SOAPMessage message = messageFactory.createMessage();
    message.getSOAPPart().setContent(new SAXSource(new InputSource(new StringReader(send))));
    

    Here is the benchmark testing various XML parsing sources and factory caching impact:

    /*
    Benchmark (jdk1.8.0_202 32-bit)                                       Mode  Cnt     Score     Error  Units
    SoapMessageBenchmark.testCreateMessage                               thrpt  100  4156,685 ? 215,571  ops/s
    SoapMessageBenchmark.testCreateMessageWithMessageFactoryNotCached    thrpt  100  3709,299 ? 115,495  ops/s
    SoapMessageBenchmark.testSetContentDom                               thrpt  100  5935,972 ? 215,389  ops/s
    SoapMessageBenchmark.testSetContentDomWithDocumentBuilderNotCached   thrpt  100  3433,539 ? 218,889  ops/s
    SoapMessageBenchmark.testSetContentSax                               thrpt  100  6693,179 ? 319,581  ops/s
    SoapMessageBenchmark.testSetContentSaxAndExtractContentAsDocument    thrpt  100  4109,924 ? 229,987  ops/s
    SoapMessageBenchmark.testSetContentStax                              thrpt  100  5126,822 ? 249,648  ops/s
    SoapMessageBenchmark.testSetContentStaxWithXmlInputFactoryNotCached  thrpt  100  4630,860 ? 235,773  ops/s
    */
    
    package org.sample;
    
    import org.openjdk.jmh.annotations.Benchmark;
    import org.openjdk.jmh.annotations.BenchmarkMode;
    import org.openjdk.jmh.annotations.Measurement;
    import org.openjdk.jmh.annotations.Mode;
    import org.openjdk.jmh.annotations.Scope;
    import org.openjdk.jmh.annotations.State;
    import org.openjdk.jmh.annotations.Timeout;
    import org.openjdk.jmh.annotations.Warmup;
    import org.w3c.dom.Document;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.soap.MessageFactory;
    import javax.xml.soap.SOAPBody;
    import javax.xml.soap.SOAPConstants;
    import javax.xml.soap.SOAPException;
    import javax.xml.soap.SOAPMessage;
    import javax.xml.stream.XMLInputFactory;
    import javax.xml.stream.XMLStreamException;
    import javax.xml.stream.XMLStreamReader;
    import javax.xml.stream.util.StreamReaderDelegate;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.sax.SAXSource;
    import javax.xml.transform.stax.StAXSource;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.concurrent.TimeUnit;
    
    @BenchmarkMode(Mode.Throughput)
    @Warmup(iterations = 10, time = 100, timeUnit = TimeUnit.MILLISECONDS)
    @Measurement(iterations = 10, time = 100, timeUnit = TimeUnit.MILLISECONDS)
    @Timeout(time = 10)
    public class SoapMessageBenchmark {
    
        private static MessageFactory messageFactory;
        private static DocumentBuilder documentBuilder;
        private static XMLInputFactory xmlInputFactory;
    
        static {
            try {
                documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
                xmlInputFactory = XMLInputFactory.newInstance();
            } catch (SOAPException | ParserConfigurationException e) {
                throw new IllegalStateException(e);
            }
        }
    
        @State(Scope.Benchmark)
        public static class S {
            byte[] bytes = ("\n" +
                                    "  \n" +
                                    "    \n" +
                                    "      xxxxxxxxxxxxxxxxxxxx\n" +
                                    "      1063\n" +
                                    "    \n" +
                                    "  \n" +
                                    "  \n" +
                                    "    \n" +
                                    "      \n" +
                                    "        1\n" +
                                    "        0\n" +
                                    "        \n" +
                                    "          2372\n" +
                                    "          RootAdUnit\n" +
                                    "          \n" +
                                    "          TOP\n" +
                                    "          ACTIVE\n" +
                                    "          1002372\n" +
                                    "          \n" +
                                    "            \n" +
                                    "              true\n" +
                                    "              FFFFFF\n" +
                                    "              0000FF\n" +
                                    "              FFFFFF\n" +
                                    "              000000\n" +
                                    "              008000\n" +
                                    "              TEXT_AND_IMAGE\n" +
                                    "              DEFAULT\n" +
                                    "              DEFAULT\n" +
                                    "              DEFAULT\n" +
                                    "            \n" +
                                    "          \n" +
                                    "        \n" +
                                    "      \n" +
                                    "    \n" +
                                    "  \n" +
                                    "").getBytes();
        }
    
        @Benchmark
        public SOAPBody testCreateMessage(S s) throws SOAPException, IOException {
            try (InputStream inputStream = new ByteArrayInputStream(s.bytes)) {
                SOAPMessage message = messageFactory.createMessage(null, inputStream);
                return message.getSOAPBody();
            }
        }
    
        @Benchmark
        public SOAPBody testCreateMessageWithMessageFactoryNotCached(S s) throws SOAPException, IOException {
            MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
            try (InputStream inputStream = new ByteArrayInputStream(s.bytes)) {
                SOAPMessage message = messageFactory.createMessage(null, inputStream);
                return message.getSOAPBody();
            }
        }
    
        @Benchmark
        public SOAPBody testSetContentDom(S s) throws SOAPException, IOException, SAXException {
            try (InputStream inputStream = new ByteArrayInputStream(s.bytes)) {
                Document document = documentBuilder.parse(inputStream);
                SOAPMessage message = messageFactory.createMessage();
                message.getSOAPPart().setContent(new DOMSource(document));
                return message.getSOAPBody();
            }
        }
    
        @Benchmark
        public SOAPBody testSetContentDomWithDocumentBuilderNotCached(S s) throws SOAPException, IOException, SAXException, ParserConfigurationException {
            DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            try (InputStream inputStream = new ByteArrayInputStream(s.bytes)) {
                Document document = documentBuilder.parse(inputStream);
                SOAPMessage message = messageFactory.createMessage();
                message.getSOAPPart().setContent(new DOMSource(document));
                return message.getSOAPBody();
            }
        }
    
        @Benchmark
        public SOAPBody testSetContentSax(S s) throws SOAPException, IOException {
            try (InputStream inputStream = new ByteArrayInputStream(s.bytes)) {
                SOAPMessage message = messageFactory.createMessage();
                message.getSOAPPart().setContent(new SAXSource(new InputSource(inputStream)));
                return message.getSOAPBody();
            }
        }
    
        @Benchmark
        public Document testSetContentSaxAndExtractContentAsDocument(S s) throws SOAPException, IOException {
            try (InputStream inputStream = new ByteArrayInputStream(s.bytes)) {
                SOAPMessage message = messageFactory.createMessage();
                message.getSOAPPart().setContent(new SAXSource(new InputSource(inputStream)));
                return message.getSOAPBody().extractContentAsDocument();
            }
        }
    
        @Benchmark
        public SOAPBody testSetContentStax(S s) throws SOAPException, IOException, XMLStreamException {
            try (InputStream inputStream = new ByteArrayInputStream(s.bytes)) {
                XMLStreamReader xmlStreamReader = new StreamReaderDelegate(xmlInputFactory.createXMLStreamReader(inputStream)) {
                    @Override
                    public String getVersion() {
                        return "1.1";
                    }
                };
                SOAPMessage message = messageFactory.createMessage();
                message.getSOAPPart().setContent(new StAXSource(xmlStreamReader));
                return message.getSOAPBody();
            }
        }
    
        @Benchmark
        public SOAPBody testSetContentStaxWithXmlInputFactoryNotCached(S s) throws SOAPException, IOException, XMLStreamException {
            XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
            try (InputStream inputStream = new ByteArrayInputStream(s.bytes)) {
                XMLStreamReader xmlStreamReader = new StreamReaderDelegate(xmlInputFactory.createXMLStreamReader(inputStream)) {
                    @Override
                    public String getVersion() {
                        return "1.1";
                    }
                };
                SOAPMessage message = messageFactory.createMessage();
                message.getSOAPPart().setContent(new StAXSource(xmlStreamReader));
                return message.getSOAPBody();
            }
        }
    
    }
    

提交回复
热议问题