[Wicket-ja-user 282] tomcat clusteringについて

Back to archive index

木村亮 exten****@gmail*****
2008年 12月 17日 (水) 02:48:35 JST


みなさん。はじめまして、ryo といいます。

はじめて、投稿させていただきます。よろしくお願いします。

wicketを利用してアプリケーション開発を行っていて、
どうしてもうまくない現象がおこってしまいます。質問させてください。

[アプリの大まかな構成]
・wicket 1.4-m3
・google-guice 1.0
・quartz (job sched) 1.6.2
[サーバ構成]
・apache
・mod_jk
・tomcat-5.5.23 (options -Xms256m -Xmx512 -XX:PermSize=64m
-XX:MaxPermSize=128m)
    ・(tomcat物理サーバが3台、バランシングはしておらず、
    セッションレプリケーション(SimpleTcpClusterを利用)のみを行う。スティッキーセッションは無効です。)
    ・同一tomcatインスタンスには、他にも5つ6つサービスがのっています。
    ・tomcat server.xmlは以下のような感じです。
※http://cwiki.apache.org/WICKET/tomcat-clustering.html
に記述してあるCluster定義とほぼ、一緒です。
異なる点はSenderのreplicationModeがsynchronous
ではなく、pooledを指定、expireSessionsOnShutdownを"true"にしています。

<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="true"
useDirtyFlag="true">

<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="XXXXXXXX"
mcastPort="XXXXXXXX"
mcastFrequency="500"
mcastDropTime="3000"/>

<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto" ← /etc/hostsをみにいく
tcpListenPort="XXXXXXX"
tcpSelectorTimeout="100"
tcpThreadCount="2"/>

<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"/>

<Valve
className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;.*\.css"/>
</Cluster>

以上の状況で、アプリにリクエストを送ると、以下のような例外が吐かれます。
2008/12/16 19:26:04 org.apache.catalina.cluster.session.DeltaManager
messageReceived
致命的: Manager [/context]: Unable to receive message through TCP channel
java.lang.IllegalArgumentException: Unknown object type null
        at
org.apache.wicket.protocol.http.pagestore.DiskPageStore.restoreAfterSerialization(DiskPageStore.java:1215)
        at
org.apache.wicket.protocol.http.SecondLevelCacheSessionStore$SecondLevelCachePageMap.readObject(SecondLevelCacheSessionStore.java:406)flect.NativeMethodAccessorImpl.invoke0(Native
Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at
java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:946)
        at
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1809)
        at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719)
        at
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
        at
org.apache.catalina.cluster.session.DeltaRequest$AttributeInfo.readExternal(DeltaRequest.java:335)
        at
org.apache.catalina.cluster.session.DeltaRequest.readExternal(DeltaRequest.java:247)
        at
org.apache.catalina.cluster.session.DeltaManager.loadDeltaRequest(DeltaManager.java:698)
        at
org.apache.catalina.cluster.session.DeltaManager.handleSESSION_DELTA(DeltaManager.java:1573)
        at
org.apache.catalina.cluster.session.DeltaManager.messageReceived(DeltaManager.java:1523)
        at
org.apache.catalina.cluster.session.DeltaManager.messageDataReceived(DeltaManager.java:1272)
        at
org.apache.catalina.cluster.session.ClusterSessionListener.messageReceived(ClusterSessionListener.java:86)
        at
org.apache.catalina.cluster.tcp.SimpleTcpCluster.receive(SimpleTcpCluster.java:1168)
        at
org.apache.catalina.cluster.tcp.ClusterReceiverBase.messageDataReceived(ClusterReceiverBase.java:427)
        at
org.apache.catalina.cluster.io.ObjectReader.execute(ObjectReader.java:108)
        at
org.apache.catalina.cluster.tcp.TcpReplicationThread.drainChannel(TcpReplicationThread.java:139)
        at
org.apache.catalina.cluster.tcp.TcpReplicationThread.run(TcpReplicationThread.java:70)
Exception in thread
"org.apache.catalina.cluster.tcp.TcpReplicationThread[1]"
java.lang.ExceptionInInitializerError
        at sun.misc.Unsafe.ensureClassInitialized(Native Method)
        at
sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:25)
        at
sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:122)
        at java.lang.reflect.Field.acquireFieldAccessor(Field.java:917)
        at java.lang.reflect.Field.getFieldAccessor(Field.java:898)
        at java.lang.reflect.Field.getLong(Field.java:527)
        at
java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1586)
        at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:52)
        at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:408)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:400)
        at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:297)
        at
java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:531)
        at
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552)
        at
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
        at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699)
        at
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
        at
org.apache.wicket.protocol.http.SecondLevelCacheSessionStore$SecondLevelCachePageMap.readObject(SecondLevelCacheSessionStore.java:403)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at
java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:946)
        at
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1809)
        at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719)
        at
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
        at
org.apache.catalina.cluster.session.DeltaRequest$AttributeInfo.readExternal(DeltaRequest.java:335)
        at
org.apache.catalina.cluster.session.DeltaRequest.readExternal(DeltaRequest.java:247)
        at
org.apache.catalina.cluster.session.DeltaManager.loadDeltaRequest(DeltaManager.java:698)
        at
org.apache.catalina.cluster.session.DeltaManager.handleSESSION_DELTA(DeltaManager.java:1573)
        at
org.apache.catalina.cluster.session.DeltaManager.messageReceived(DeltaManager.java:1523)
        at
org.apache.catalina.cluster.session.DeltaManager.messageDataReceived(DeltaManager.java:1272)
        at
org.apache.catalina.cluster.session.ClusterSessionListener.messageReceived(ClusterSessionListener.java:86)
        at
org.apache.catalina.cluster.tcp.SimpleTcpCluster.receive(SimpleTcpCluster.java:1168)
        at
org.apache.catalina.cluster.tcp.ClusterReceiverBase.messageDataReceived(ClusterReceiverBase.java:427)
        at
org.apache.catalina.cluster.io.ObjectReader.execute(ObjectReader.java:108)
        at
org.apache.catalina.cluster.tcp.TcpReplicationThread.drainChannel(TcpReplicationThread.java:139)
        at
org.apache.catalina.cluster.tcp.TcpReplicationThread.run(TcpReplicationThread.java:70)
Caused by: org.apache.wicket.WicketRuntimeException: There is no application
attached to current thread
org.apache.catalina.cluster.tcp.TcpReplicationThread[1]
        at org.apache.wicket.Application.get(Application.java:177)
        at org.apache.wicket.Component.getApplication(Component.java:1277)
        at org.apache.wicket.Component.<init>(Component.java:893)
        at
org.apache.wicket.MarkupContainer.<init>(MarkupContainer.java:108)
        at org.apache.wicket.Page.<init>(Page.java:238)
        at
org.apache.wicket.protocol.http.pagestore.SerializedPagesCache$SerializedPageWithSession$1.<init>(SerializedPagesCache.java:206)
        at
org.apache.wicket.protocol.http.pagestore.SerializedPagesCache$SerializedPageWithSession.<clinit>(SerializedPagesCache.java:205)
        ... 40 more
Exception in thread
"org.apache.catalina.cluster.tcp.TcpReplicationThread[2]"
java.lang.ExceptionInInitializerError
        at sun.misc.Unsafe.ensureClassInitialized(Native Method)
        at
sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:25)
        at
sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:122)
        at java.lang.reflect.Field.acquireFieldAccessor(Field.java:917)
        at java.lang.reflect.Field.getFieldAccessor(Field.java:898)
        at java.lang.reflect.Field.getLong(Field.java:527)
        at
java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1586)
        at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:52)
        at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:408)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:400)
        at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:297)
        at
java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:531)
        at
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552)
        at
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
        at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699)
        at
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
        at
org.apache.wicket.protocol.http.SecondLevelCacheSessionStore$SecondLevelCachePageMap.readObject(SecondLevelCacheSessionStore.java:403)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at
java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:946)
        at
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1809)
        at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719)
        at
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
        at
org.apache.catalina.cluster.session.DeltaRequest$AttributeInfo.readExternal(DeltaRequest.java:335)
        at
org.apache.catalina.cluster.session.DeltaRequest.readExternal(DeltaRequest.java:247)
        at
org.apache.catalina.cluster.session.DeltaManager.loadDeltaRequest(DeltaManager.java:698)
        at
org.apache.catalina.cluster.session.DeltaManager.handleSESSION_DELTA(DeltaManager.java:1573)
        at
org.apache.catalina.cluster.session.DeltaManager.messageReceived(DeltaManager.java:1523)
        at
org.apache.catalina.cluster.session.DeltaManager.messageDataReceived(DeltaManager.java:1272)
        at
org.apache.catalina.cluster.session.ClusterSessionListener.messageReceived(ClusterSessionListener.java:86)
        at
org.apache.catalina.cluster.tcp.SimpleTcpCluster.receive(SimpleTcpCluster.java:1168)
        at
org.apache.catalina.cluster.tcp.ClusterReceiverBase.messageDataReceived(ClusterReceiverBase.java:427)
        at
org.apache.catalina.cluster.io.ObjectReader.execute(ObjectReader.java:108)
        at
org.apache.catalina.cluster.tcp.TcpReplicationThread.drainChannel(TcpReplicationThread.java:139)
        at
org.apache.catalina.cluster.tcp.TcpReplicationThread.run(TcpReplicationThread.java:70)

Caused by: org.apache.wicket.WicketRuntimeException: There is no application
attached to current thread
org.apache.catalina.cluster.tcp.TcpReplicationThread[1]
        at org.apache.wicket.Application.get(Application.java:177)
        at org.apache.wicket.Component.getApplication(Component.java:1277)
        at org.apache.wicket.Component.<init>(Component.java:893)
        at
org.apache.wicket.MarkupContainer.<init>(MarkupContainer.java:108)
        at org.apache.wicket.Page.<init>(Page.java:238)
        at
org.apache.wicket.protocol.http.pagestore.SerializedPagesCache$SerializedPageWithSession$1.<init>(SerializedPagesCache.java:206)
        at
org.apache.wicket.protocol.http.pagestore.SerializedPagesCache$SerializedPageWithSession.<clinit>(SerializedPagesCache.java:205)
        ... 40 moreorg.apache.catalina.cluster.tcp.TcpReplicationThread

このスタックトレースを見る限りだと、org.apache.catalina.cluster.tcp.TcpReplicationThreadのThreadLocalからApplicationオブジェクトが取得できずに、
WicketRuntimeExceptionをはいています。

これは、単純に、セッションレプリケーションができていないとみなしてよいでしょうか?
tomcatの一時領域には、disk page storeファイルが出力されていました。(1台のみ)

スタックトレースの
at
org.apache.wicket.protocol.http.pagestore.DiskPageStore.restoreAfterSerialization(DiskPageStore.java:1215)
のソースを追ってみると、SecondLevelCacheSessionStore$SecondLevelCachePageMap
クラスの以下の箇所で、IllegalArgumentExceptionが投げられていました。

private void readObject(java.io.ObjectInputStream s) throws IOException,
            ClassNotFoundException
        {
            s.defaultReadObject();

            IPageStore store = getPageStore();

            if (sessionId != null && store instanceof IClusteredPageStore ==
false)
            {
                Object lastPage = s.readObject();
                if (store instanceof ISerializationAwarePageStore)
                {
                    lastPage =
((ISerializationAwarePageStore)store).restoreAfterSerialization((Serializable)lastPage);
←ここ
                }
                this.lastPage = lastPage;
            }
        }

DiskPageStore.restoreAfterSerializationメソッド、

/**
     * @see
org.apache.wicket.protocol.http.SecondLevelCacheSessionStore.ISerializationAwarePageStore#restoreAfterSerialization(java.io.Serializable)
     */
    public Object restoreAfterSerialization(Serializable serializable)
    {
        if (!storeAfterSessionReplication() || serializable instanceof Page)
        {
            return serializable;
        }
        else if (serializable instanceof SerializedPageWithSession)
        {
            SerializedPageWithSession page =
(SerializedPageWithSession)serializable;
            if (page.page == null || page.page.get() !=
SerializedPageWithSession.NO_PAGE)
            {
                storeSerializedPages(page.sessionId, page.pages);
                return stripSerializedPage(page);
            }
            else
            {
                return page;
            }
        }
        else
        {
            String type = serializable != null ?
serializable.getClass().getName() : null;
            throw new IllegalArgumentException("Unknown object type " +
type); ←ここでIllegalArgumentExceptionがスロー
        }
    }
引数に渡されるserializable(SecondLevelCacheSessionStore$SecondLevelCachePageMap#readObject(ObjectInputStreamから読み込んだlastPage)がnullのため、IllegalArgumentExceptionをスローしていました。
なぜ、このような状況になるのかの原因の切り分けが現状できていません。

何か、参考になるようなことがあれば、ご教授いただきたく投稿させていただきました。
以上よろしくお願いいたします。
-------------- next part --------------
HTMLの添付ファイルを保管しました...
下載 


Wicket-ja-user メーリングリストの案内
Back to archive index