0

Axis2がSOAPメッセージを解析するときに非合体XMLStreamReaderを使用する方法を知っている人はいますか?

大きなbase64バイナリテキスト要素を読み取るコードを書いています。合体はデフォルトの動作であり、これにより、デフォルトのXMLStreamReaderは、複数のCHARACTERSイベントを返すのではなく、テキスト全体をメモリにロードします。その結果、次のコードを実行するとヒープスペースが不足します。

reader = element.getTextAsStream( true );

OutOfMemoryエラーは次の場所で発生しcom.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.nextます:

java.lang.OutOfMemoryError: Java heap space
    at com.sun.org.apache.xerces.internal.util.XMLStringBuffer.append(XMLStringBuffer.java:208)
    at com.sun.org.apache.xerces.internal.util.XMLStringBuffer.append(XMLStringBuffer.java:226)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanContent(XMLDocumentFragmentScannerImpl.java:1552)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2864)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:558)
    at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225)
    at org.apache.axiom.util.stax.dialect.DisallowDoctypeDeclStreamReaderWrapper.next(DisallowDoctypeDeclStreamReaderWrapper.java:34)
    at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225)
    at org.apache.axiom.util.stax.dialect.SJSXPStreamReaderWrapper.next(SJSXPStreamReaderWrapper.java:138)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:668)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214)
    at org.apache.axiom.om.impl.llom.SwitchingWrapper.updateNextNode(SwitchingWrapper.java:1098)
    at org.apache.axiom.om.impl.llom.SwitchingWrapper.<init>(SwitchingWrapper.java:198)
    at org.apache.axiom.om.impl.llom.OMStAXWrapper.<init>(OMStAXWrapper.java:73)
    at org.apache.axiom.om.impl.llom.OMContainerHelper.getXMLStreamReader(OMContainerHelper.java:67)
    at org.apache.axiom.om.impl.llom.OMContainerHelper.getXMLStreamReader(OMContainerHelper.java:40)
    at org.apache.axiom.om.impl.llom.OMElementImpl.getXMLStreamReader(OMElementImpl.java:790)
    at org.apache.axiom.om.impl.llom.OMElementImplUtil.getTextAsStream(OMElementImplUtil.java:114)
    at org.apache.axiom.om.impl.llom.OMElementImpl.getTextAsStream(OMElementImpl.java:826)
    at org.example.UploadFileParser.invokeBusinessLogic(UploadFileParser.java:160)
4

2 に答える 2

1

http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP5.htmlを試してください。これは、Mavenの中央リポジトリから次のように入手することもできます。

    <groupId>com.sun.xml.stream</groupId>
    <artifactId>sjsxp</artifactId>
    <version>1.0.2</version>

クラスパスに配置すると、デフォルトのimplが上書きされます

更新別の方法があります。独自のXMLInputFactoryを作成する

public class XMLInputFactory extends
        com.sun.xml.internal.stream.XMLInputFactoryImpl {

    @Override
    public XMLStreamReader createXMLStreamReader(Reader reader)
            throws XMLStreamException {
        return super.createXMLStreamReader(reader);
    }
}

ファイルを作成する

META-INF/services/javax.xml.stream.XMLInputFactory

javax.xml.stream.XMLInputFactoryがファイル名であることに注意してください。そのファイルにクラスの完全に修飾された名前を入れますtest.XMLInputFactory。詳細については、http://docs.oracle.com/javase/1.4.2/docs/guide/jar/jar.html(サービスプロバイダー)を参照してください。

Axis2にXMLInputFactoryをロードさせます。これで、メソッド呼び出しをインターセプトして、解析動作を変更できます。

于 2012-12-20T05:21:19.793 に答える
1

これはかなり簡単です。Axiomユーザーガイドの次のセクションを参照してください。

http://ws.apache.org/axiom/userguide/ch04.html#factory.properties

于 2012-12-20T15:27:41.780 に答える