5

スタンドアロン Java アプリケーションの場合、有効な XML コンテンツを含む文字列が原因で JAXB が次のような例外をスローする非常にまれなエラーが発生します。

javax.xml.bind.UnmarshalException
 - with linked exception:
[org.xml.sax.SAXParseException: 
    <Line 1, Column 129>: XML-20221: (Fatal Error) Invalid char in text.]

これは、古いバージョンの Java 用に作成された非常に古い Java アプリケーションであり、既存の依存関係があります。

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>xdb-xmlparser</artifactId>
    <version>10.2.0.3.0</version>
</dependency>

エラー コードは一貫して XML-20221 ですが、原因は次のようにさまざまです。

XML-20221: (Fatal Error) Invalid char in text.

XML-20100: (Fatal Error) Expected '?>'.]

XML-20121: (Fatal Error) End tag does not match start tag 'TotalDepositReqd'.

残りのスタック トレースもさまざまですが、通常は次のようになります。

at oracle.xml.parser.v2.XMLError.flushErrorHandler(XMLError.java:415)
at oracle.xml.parser.v2.XMLError.flushErrors1(XMLError.java:284)
at oracle.xml.parser.v2.NonValidatingParser.parseEndTag(NonValidatingParser.java:1359)
at oracle.xml.parser.v2.NonValidatingParser.parseElement(NonValidatingParser.java:1304)
at oracle.xml.parser.v2.NonValidatingParser.parseRootElement(NonValidatingParser.java:326)
at oracle.xml.parser.v2.NonValidatingParser.parseDocument(NonValidatingParser.java:293)
at oracle.xml.parser.v2.XMLParser.parse(XMLParser.java:209)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:211)

Java のバージョンは次のとおりです。

java version "1.6.0_16"
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) Server VM (build 14.2-b01, mixed mode)

現在のコマンドラインは次のとおりです。

java
-server
-Xmx2048m
-Xms2048m
-XX:MaxPermSize=128m
-XX:+UseConcMarkSweepGC
-Dsun.rmi.dgc.server.gcInterval=0x2932E00
-Dsun.rmi.dgc.client.gcInterval=3600000
-verbosegc
-Xloggc:/path/to/file
-gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Djavax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl
-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
-Djava.endorsed.dirs=/path/to/endorsed
-Duser.country=GB
-Duser.language=en
-Dhttp.keepAlive=false foo.ListenerServer

通常、これらは数秒にわたる小さなバーストで見られます。これは、内部バッファが破損していることを示唆していますか? これらの例外は、JVM の稼働時間が長くなるほど一般的になります。JVM のバウンスにより、問題は数日間解決されます。

  • 他の誰かが似たようなものを見たことがありますか?
  • もしそうなら、あなたはこれを解決することができましたか?
  • おそらく、別の JAXB/JAXP 実装に移行する必要がありますか?
4

1 に答える 1

4

Unmarshaller開発者がインスタンスをキャッシュして異なるスレッド間で共有したときに、同様の問題 (アンマーシャリング中の散発的な例外) を見たことがあります。ドキュメントによると、これUnmarshallerはスレッドセーフではありません。

于 2012-06-11T11:04:58.637 に答える