ClassNotFoundException for Custom JMX Notification(2)
ekobir May 15, 2009 4:58 AMHi All
I thought I might need to clarify myself better to find out what I'm doing wrong. Please check the simple code below and its configuration.
Scenario: 2 Nodes --> 1 on linux, 1 on windows xp
Version of As= jboss EAP 5.0.0
Java 1,6
JBoss As 1 starts on linux and get deployed. startSingleton will get executed without a problem as there is no other service in the cluster.
JBoss As 2 starts on windows and get deloyed. This deployment forces service instance on As 1 to give up being master. (Still couldnt figured out why....)
When service deployed on As 2 become master it sends notification to remote with provisionMessage. When notification hit As 1, As 1 start throwing ClassNotFoundException.
I know it is class loader issue at ear level but I couldnt figured out how to resolve.
Note: ProvisionMessage and TestService in the same package.
Code is executed on : jboss eap 5.0.0 Alpha
Thanks, please let me know anymore information.
Below is simple service code
public class TestService extends HAServiceMBeanSupport implements TestServiceMBean, NotificationListener { private static Logger logger = Logger.getLogger( TestService.class); @Override public void startSingleton(){ logger.info("Start Singleton Service"); Notification not = new Notification("Test", this, System.currentTimeMillis()); not.setUserData(new ProvisionMessage(1, 1)); try{ this.sendNotificationRemote(not); }catch(Exception e){ logger.error(e); } } @Override public void stopSingleton(){ logger.info("Stop Singleton Service"); } @Override protected void createService() throws Exception { super.createService(); logger.info("Create Service"); } @Override protected void startService() throws Exception { super.startService(); logger.info("Start Service"); this.addNotificationListener(this, null, null); } @Override protected void stopService() throws Exception { super.stopService(); logger.info("Stop Service"); } @Override protected void destroyService() throws Exception { super.destroyService(); logger.info("Destroy Service"); } @Override public void handleNotification(Notification notification, Object handback) { ProvisionMessage msg = (ProvisionMessage)notification.getUserData(); logger.info(msg); } } public class ProvisionMessage implements Externalizable { private int accId; private int conId; public ProvisionMessage(int accountId, int connectionId) { this.accountId = accountId; this.connectionId = connectionId; } public ProvisionMessage(){ //For Serialization } @Override public void writeExternal(ObjectOutput out) throws IOException { out.write(accId); out.write(conId); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { this.accId = in.readInt(); this.conId = in.readInt(); } public int getAccId() { return accId; } public int getConId() { return conId; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final ProvisionMessage other = (ProvisionMessage) obj; if (this.accId != other.accId) { return false; } if (this.conId != other.conId) { return false; } return true; } @Override public int hashCode() { int hash = 7; hash = 59 * hash + this.accId; hash = 59 * hash + this.conId; return hash; }
Exception :
09:40:29,709 INFO [STDOUT] 09:40:29,709 INFO [TestService] Stop Singleton Service 09:40:29,720 WARN [ClusterPartition$RpcHandler] Partition xyz failed extracting message body from request bytes java.lang.ClassNotFoundException: xyz.ProvisionMessage at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.$$YJP$$doPrivileged(Native Method) at java.security.AccessController.doPrivileged(AccessController.java) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:252) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) at java.lang.Class.$$YJP$$forName0(Native Method) at java.lang.Class.forName0(Class.java) at java.lang.Class.forName(Class.java:247) at org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:279) at org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:1102) at org.jboss.classloader.spi.base.BaseClassLoader.loadClassFromDomain(BaseClassLoader.java:772) at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:415) at java.lang.ClassLoader.loadClass(ClassLoader.java:252) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) at java.lang.Class.$$YJP$$forName0(Native Method) at java.lang.Class.forName0(Class.java) at java.lang.Class.forName(Class.java:247) at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:604) at org.jboss.invocation.MarshalledValueInputStream.resolveClass(MarshalledValueInputStream.java:109) 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.defaultReadFields(ObjectInputStream.java:1947) at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:480) at javax.management.Notification.readObject(Notification.java:352) 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:597) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1667) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1323) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at org.jgroups.blocks.MethodCall.readExternal(MethodCall.java:488) at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1792) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1751) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at org.jboss.ha.framework.server.ClusterPartition.objectFromByteBufferInternal(ClusterPartition.java:1852) at org.jboss.ha.framework.server.ClusterPartition$RpcHandler.handle(ClusterPartition.java:2218) at org.jgroups.blocks.RequestCorrelator.handleRequest(RequestCorrelator.java:637) at org.jgroups.blocks.RequestCorrelator.receiveMessage(RequestCorrelator.java:545) at org.jgroups.blocks.RequestCorrelator.receive(RequestCorrelator.java:368) at org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.up(MessageDispatcher.java:775) at org.jgroups.JChannel.up(JChannel.java:1274) at org.jgroups.stack.ProtocolStack.up(ProtocolStack.java:462) at org.jgroups.protocols.pbcast.FLUSH.up(FLUSH.java:443) at org.jgroups.protocols.pbcast.STATE_TRANSFER.up(STATE_TRANSFER.java:144) at org.jgroups.protocols.FRAG2.up(FRAG2.java:192) at org.jgroups.protocols.FC.up(FC.java:468) at org.jgroups.protocols.pbcast.GMS.up(GMS.java:791) at org.jgroups.protocols.pbcast.STABLE.up(STABLE.java:233) at org.jgroups.protocols.UNICAST.up(UNICAST.java:299) at org.jgroups.protocols.pbcast.NAKACK.handleMessage(NAKACK.java:873) at org.jgroups.protocols.pbcast.NAKACK.up(NAKACK.java:705) at org.jgroups.protocols.VERIFY_SUSPECT.up(VERIFY_SUSPECT.java:167) at org.jgroups.protocols.FD.up(FD.java:284) at org.jgroups.protocols.FD_SOCK.up(FD_SOCK.java:309) at org.jgroups.protocols.MERGE2.up(MERGE2.java:144) at org.jgroups.protocols.Discovery.up(Discovery.java:263) at org.jgroups.protocols.PING.up(PING.java:273) at org.jgroups.protocols.TP$ProtocolAdapter.up(TP.java:2327) at org.jgroups.protocols.TP.passMessageUp(TP.java:1261) at org.jgroups.protocols.TP.access$100(TP.java:49) at org.jgroups.protocols.TP$IncomingPacket.handleMyMessage(TP.java:1838) at org.jgroups.protocols.TP$IncomingPacket.run(TP.java:1817) 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)