[mayaa-user:1003] サーバー再起動時等にUnsupportedOperationException
Susumu ISHIGAMI
[E-MAIL ADDRESS DELETED]
2014年 2月 8日 (土) 20:38:12 JST
石上です
いつもお世話になっております。
Mayaaを使用したサービス運用中に下記のExceptionが発生しました。
java.lang.UnsupportedOperationException
at org.seasar.mayaa.impl.engine.EngineImpl.iterateChildNode(EngineImpl.java:331)
at org.seasar.mayaa.impl.engine.specification.SpecificationUtil.getMayaaNode(SpecificationUtil.java:129)
at org.seasar.mayaa.impl.engine.specification.SpecificationUtil.execEvent(SpecificationUtil.java:212)
at (独自クラスのため非表示)→実質的にはPageImpl.java202行目:
SpecificationUtil.execEvent(engine, QM_AFTER_RENDER_PAGE);
at org.seasar.mayaa.impl.engine.EngineImpl.doPageService(EngineImpl.java:373)
at org.seasar.mayaa.impl.engine.EngineImpl.doService(EngineImpl.java:481)
at org.seasar.mayaa.impl.MayaaServlet.doService(MayaaServlet.java:107)
at org.seasar.mayaa.impl.MayaaServlet.doGet(MayaaServlet.java:90)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
:
以下省略
ソースを追ってみると、
EngineImpl.javaに下記の記載があり
public Iterator iterateChildNode() {
if (_defaultSpecification != null) {
return _defaultSpecification.iterateChildNode();
}
throw new UnsupportedOperationException();
}
_defaultSpecificationがnullの時に起きているのではないかと思います。
_defaultSpecificationがnullになるのは、
起動直後かreleaseDefaultSpecification()が呼び出された後ではないかと思います。
通常、releaseDefaultSpecificationはsynchronizedメソッドか、
synchronized(this)によって同期化されていますが、
エラーが起きた
iterateChildNode
でだけは同期化を行っていません。
おそらくこのメソッドをsynchronizedにすれば発生しないのではないかと思いますが、
EngineImplはシングルトンだと思いますので、これを同期化したらパフォーマンスに影響するかも
しれません。
ほぼイレギュラーケースですので、nullだったらリトライをするか、
_defaultSpecificationをvolatileにしてダブルチェックするなどをご検討頂けませんでしょうか。
私も本番環境で実際にエラーを見たわけではないので、
本当にレアケースなのではないかと思いますが、
日々運用していると時々見かけます。
mayaa-user メーリングリストの案内