[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 メーリングリストの案内