[ 
https://issues.apache.org/jira/browse/GERONIMO-5616?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Forrest Xia updated GERONIMO-5616:
----------------------------------

    Attachment: GERONIMO-5616_2.patch

Oops, I should try this fix by building all of Tomcat code, sorry for that.

As the exception indicates that tribes class will dynamically load 
SessionMessageImpl from catalina-ha bundle, so to make tomcat native clustering 
works well, tribes bundle must be able to load the class from catalina-ha.

I tried another fix that adding <DynamicImport-Package>*<DynamicImport-Package> 
and it works. So I made another patch for this bug. Please review. Thanks!

Forrest

> Tomcat native cluster not working because of ClassNotFoundException: 
> org.apache.catalina.ha.session.SessionMessageImpl
> ----------------------------------------------------------------------------------------------------------------------
>
>                 Key: GERONIMO-5616
>                 URL: https://issues.apache.org/jira/browse/GERONIMO-5616
>             Project: Geronimo
>          Issue Type: Bug
>      Security Level: public(Regular issues) 
>          Components: Tomcat
>    Affects Versions: 3.0
>         Environment: Windows 7 x86
> sun jdk 1.6.0_20
>            Reporter: Forrest Xia
>            Assignee: Forrest Xia
>             Fix For: 3.0
>
>         Attachments: GERONIMO-5616.patch, GERONIMO-5616_2.patch
>
>
> Configure the tomcat native cluster via these steps to reproduce this bug
> 1. Get a latest geronimo tomcat build and unzip it to a folder
> 2. Update var/catalina/server.xml to add these lines into <Engine>
> <Engine name="Catalina" defaultHost="${ServerHostname}" jvmRoute="server2">   
>          
>             <!--Put the cluster just after Engine, not in the Host element-->
>                               <Cluster 
> className="org.apache.catalina.ha.tcp.SimpleTcpCluster" 
> channelSendOptions="8">
>                     <Manager 
> className="org.apache.catalina.ha.session.DeltaManager" 
> expireSessionsOnShutdown="false" notifyListenersOnReplication="true" 
> name="${clusterName}" channelSendOptions="6" mapSendOptions="6"/>
>                     <Channel 
> className="org.apache.catalina.tribes.group.GroupChannel">
>                     <!--Update <server1_IP> with the real IP, for example, 
> 9.1.2.3, the server2 must be in the same subnet as server1-->
>                         <Membership 
> className="org.apache.catalina.tribes.membership.McastService" 
> bind="localhost" address="228.0.0.4" port="45564" frequency="500" 
> dropTime="3000" />
>                         <Receiver 
> className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
> address="localhost" port="4000" autoBind="100" selectorTimeout="5000" 
> maxThreads="6" />
>                         <Sender 
> className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
>                             <Transport 
> className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
>                         </Sender>                        
>                         <Interceptor 
> className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" 
> interval="60"/>                        
>                         
>                         <Interceptor 
> className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"
>  />
>                         <Interceptor 
> className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"
>  />                        
>                     </Channel>
>                     <Valve 
> className="org.apache.catalina.ha.tcp.ReplicationValve" 
> filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;" />
>                     <Valve 
> className="org.apache.catalina.ha.session.JvmRouteBinderValve" />
>                     <ClusterListener 
> className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />
>                     <ClusterListener 
> className="org.apache.catalina.ha.session.ClusterSessionListener" />
>       </Cluster>
> 3. Copy this server to another folder and update the portoffset, so that the 
> server can run in the same machine, note that change jvmRoute property to 
> another value.
> 4. Start server1 and server2, the server will try to setup a dynamic 
> clustering via multicast service. You will see an ClassNotFoundException when 
> trying to setup the cluster as following:
> 2010-09-20 23:42:06,594 ERROR [GroupChannel] Unable to deserialize 
> message:ClusterData[src=org.apache.catalina.tribes.membership.MemberImpl[tcp://{127,
>  0, 0, 1}:4000,{127, 0, 0, 1},4000, alive=15847, securePort=-1, UDP Port=-1, 
> id={-69 -59 107 100 42 49 65 125 -87 88 55 -60 67 60 110 -25 }, payload={}, 
> command={}, domain={}, ]; id={102 -106 41 40 -55 -74 75 -106 -70 15 -66 -8 
> -58 117 -11 -16 }; sent=2010-09-20 23:42:06.567]
> java.lang.ClassNotFoundException: 
> org.apache.catalina.ha.session.SessionMessageImpl
>       at 
> org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:494)
>       at 
> org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:410)
>       at 
> org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:398)
>       at 
> org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:105)
>       at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
>       at java.lang.Class.forName0(Native Method)
>       at java.lang.Class.forName(Class.java:247)
>       at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:604)
>       at 
> java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)
>       at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
>       at 
> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
>       at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
>       at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
>       at 
> org.apache.catalina.tribes.io.XByteBuffer.deserialize(XByteBuffer.java:573)
>       at 
> org.apache.catalina.tribes.io.XByteBuffer.deserialize(XByteBuffer.java:555)
>       at 
> org.apache.catalina.tribes.group.GroupChannel.messageReceived(GroupChannel.java:258)
>       at 
> org.apache.catalina.tribes.group.ChannelInterceptorBase.messageReceived(ChannelInterceptorBase.java:80)
>       at 
> org.apache.catalina.tribes.group.interceptors.TcpFailureDetector.messageReceived(TcpFailureDetector.java:112)
>       at 
> org.apache.catalina.tribes.group.ChannelInterceptorBase.messageReceived(ChannelInterceptorBase.java:80)
>       at 
> org.apache.catalina.tribes.group.ChannelInterceptorBase.messageReceived(ChannelInterceptorBase.java:80)
>       at 
> org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor.messageReceived(ThroughputInterceptor.java:90)
>       at 
> org.apache.catalina.tribes.group.ChannelInterceptorBase.messageReceived(ChannelInterceptorBase.java:80)
>       at 
> org.apache.catalina.tribes.group.ChannelCoordinator.messageReceived(ChannelCoordinator.java:258)
>       at 
> org.apache.catalina.tribes.transport.ReceiverBase.messageDataReceived(ReceiverBase.java:271)
>       at 
> org.apache.catalina.tribes.transport.nio.NioReplicationTask.drainChannel(NioReplicationTask.java:212)
>       at 
> org.apache.catalina.tribes.transport.nio.NioReplicationTask.run(NioReplicationTask.java:101)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>       at java.lang.Thread.run(Thread.java:619)
> This exception will lead to session replication failures. I guess this is 
> caused by classloader mechanism change. In the bundle classloader, there is 
> no SessionMessageImpl class to be able to load.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to