axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tammy Dugan (JIRA)" <j...@apache.org>
Subject [jira] Commented: (AXIS2-2743) OutOfMemory error returning large xml
Date Thu, 14 Jun 2007 13:58:27 GMT

    [ https://issues.apache.org/jira/browse/AXIS2-2743?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12504744
] 

Tammy Dugan commented on AXIS2-2743:
------------------------------------

I traced through the code and this is what I found:

// line 59 in MTOMXMLStreamWriter (format.isOptimized buffers all the output xml in a StringWriter)
 
public MTOMXMLStreamWriter(OutputStream outStream, OMOutputFormat format)
            throws XMLStreamException, FactoryConfigurationError {
        this.format = format;
        this.outStream = outStream;

        if (format.getCharSetEncoding() == null) //Default encoding is UTF-8
            format.setCharSetEncoding(OMOutputFormat.DEFAULT_CHAR_SET_ENCODING);

        if (format.isOptimized()) {
            bufferedSOAPBody = new StringWriter();
            xmlWriter = StAXUtils.createXMLStreamWriter(bufferedSOAPBody);
        } else {
            xmlWriter = StAXUtils.createXMLStreamWriter(outStream,
                                                        format.getCharSetEncoding());
        }
    }

// line 415 in OMNodeImpl (makes the XMLStreamWriter a MTOMXMLStreamWriter)

 public void serializeAndConsume(OutputStream output, OMOutputFormat format)
            throws XMLStreamException {
        MTOMXMLStreamWriter writer = new MTOMXMLStreamWriter(output, format);
        internalSerializeAndConsume(writer);
        writer.flush();
        if (format.isAutoCloseWriter()) {
            writer.close();
        }
    }

//line 140 CommonsHTTPTransportSender (sets format.doOptimize to true since I'm using MTOM
public InvocationResponse invoke(MessageContext msgContext)
            throws AxisFault {
        try {
            OMOutputFormat format = new OMOutputFormat();
            // if (!msgContext.isDoingMTOM())
            msgContext.setDoingMTOM(HTTPTransportUtils.doWriteMTOM(msgContext));
            msgContext.setDoingSwA(HTTPTransportUtils.doWriteSwA(msgContext));
            msgContext.setDoingREST(HTTPTransportUtils.isDoingREST(msgContext));
            format.setSOAP11(msgContext.isSOAP11());
            format.setDoOptimize(msgContext.isDoingMTOM());

//line 41 of MIMEOutputUtils (the writer.toString() causes the output of memory error
public static void complete(OutputStream outStream,
                                StringWriter writer, LinkedList binaryNodeList,
                                String boundary, String contentId, String charSetEncoding,
                                String SOAPContentType) {
        try {
            startWritingMime(outStream, boundary);

            javax.activation.DataHandler dh = new javax.activation.DataHandler(writer.toString(),
                                                                               "text/xml;
charset=" +
                                                                                       charSetEncoding);


Why does it have to buffer all the xml to use MTOM? Can I turn off the optimization and still
use MTOM? Wouldn't it work to stream the body xml and buffer the attachments so the attachments
can be optimized?

> OutOfMemory error returning large xml
> -------------------------------------
>
>                 Key: AXIS2-2743
>                 URL: https://issues.apache.org/jira/browse/AXIS2-2743
>             Project: Axis 2.0 (Axis2)
>          Issue Type: Bug
>    Affects Versions: 1.2
>         Environment: Windows XP
>            Reporter: Tammy Dugan
>            Assignee: Davanum Srinivas
>         Attachments: services.xml, TestAxis2ReturnDataset.java
>
>
> When I try to return 270 MB of xml from an axis2 service, I get an OutOfMemory error.
I wrote my own CustomDataSource and the error occurs in the following serialize method:
> public void serialize(XMLStreamWriter xmlWriter) throws XMLStreamException
> 	{
> 		XMLStreamReader reader = null;
> 		StreamingOMSerializer serializer = new StreamingOMSerializer();
> 		reader = getReader();
> 		System.out.println("before out of memory error");
> 		serializer.serialize(reader, xmlWriter);// OutOfMemory error here
> 		System.out.println("after out of memory error");
> 		xmlWriter.flush();
> 	}
> If I run the serialize locally and create my own xmlWriter, there is no error. However,
if the serialize gets called from an axis2 service, an OutOfMemory error occurs. Because of
this, I really think that axis2 is using a writer as input to XMLStreamWriter that is buffering
all the data. It shouldn't be doing that.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org


Mime
View raw message