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 件のコメント:
コメントを投稿