[Java] JDK 7u45, AWS Issue 123 and JAXP00010001

原文はこちら。
https://blogs.oracle.com/joew/entry/jdk_7u45_aws_issue_123

github [1]やJava Technology & XML Forum[2]で報告されているような問題に直面した場合には、パッチが次回のアップデートで出てくる前の現時点では、JDK-8028111 [3]に投稿されている回避策が有用でしょう。
この問題は、GitHubのレポートスレッドで議論されている通り、新しいXMLSecurityManagerが誤って各ドキュメント毎のパースではなく、プロセス全体にカウンターを適用していたというものです。しかし、XMLSecurityManagerで上限を無効にするという回避策はお勧めできません。その理由は、まず、他の保護も同様に無効になるでしょうし、2つめには、XMLSecurityManagerは、JDKの内部で利用されるものであり、将来変更される可能性があるためです。上限を無効にしたい場合には、システムプロパティのjdk.xml.entityExpansionLimitを0にするほうがよいでしょう。

JAXP Tutorial[4]で説明しているように、上限を変更する方法には3個あります。例えば、次の設定でentityExpansionLimitを500,000に増加させることができます。
inputFactory.setProperty(JDK_ENTITY_EXPANSION_LIMIT, "500000");
ここで、
JDK_ENTITY_EXPANSION_LIMIT = "http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit"
です。
適切な上限を見積もる上で、getEntityCountInfoは有用かもしれません。詳細はJAXP Tutorial[4]を参照してください。

そして次の設定は、jdk.xml.entityExpansionLimitに0を設定するのと同じ効果があります:
inputFactory.setProperty(JDK_ENTITY_EXPANSION_LIMIT、"0");
コード変更を必要とする以外は、XMLSecurityManagerの設定の場合と同じです。コード変更が可能であれば、JDK-8028111(ファクトリのリフレッシュ)で記載されている2番目の回避策のほうがよりよいでしょう。理由は処理を続行できるようにしながら、全ての保護を無効にする必要がないからです。

[1] Exceptions on SQS result kill the http-client in the SDK
https://github.com/aws/aws-sdk-java/issues/123
[2] StAX XMLInputFactory cannot create more than 64000 readers [JDK 1.7.0_45]
https://forums.oracle.com/thread/2594170
[3] XML readers share the same entity expansion counter
https://bugs.openjdk.java.net/browse/JDK-8028111
[4] Using the Limits (The Java Tutorials)
http://docs.oracle.com/javase/tutorial/jaxp/limits/using.html

0 件のコメント:

コメントを投稿