0 Replies Latest reply on May 13, 2009 8:54 AM by erkin kanlioglu

    ClassNotFoundException for Custom JMX Notification

    erkin kanlioglu Newbie

      Hi All

      I'm trying to send a custom externalizable class via jmx notification from a service to same service running on different node.
      Whenever jmx notifications hit the remote node(s), remote node(s) starts throwing
      ClassNotFoundException.

      This problem reminds me the f.a. question below from jboss cache.


      Does JBoss Cache handle the concept of application classloading inside, say, a Java EE container?


      After little investigation, I have found out that MarshalledValueInputStream gets contextclassloader from SecurityActions and SecurityActions get the classLoader from the thread which execution on.

      So my questions are,

      1)How can I provide a hook/delegation for finding class loader from my application to underlying jboss?
      2)Is there any example for this?
      3) If you know jboss cache, how can I say solve same ClassNotFoundException?
      I tried to use Region creation on cache like below, but no luck...
       Fqn configurationFqn = Fqn.fromString(fqnName);
       Region region =
       this.configurationCache.getRegion(configurationFqn, true);
       region.registerContextClassLoader(this.getClass().getClassLoader());
      




      Note: Notification service which extends from HAServiceMBeanSupport and custom externalizable class is in the same SAR file and deployed as a ear file.

      Thanks for your help.

      public class NodeServiceNotification implements Externalizable{
      
       public static final String NAME = "SERVICE_NOTIFICATION";
       private Data someData;
       private long creationTime;
      
       public NodeServiceNotification( Data someData) {
       this.creationTime = System.currentTimeMillis();
       this.someData = someData;
       }
      
       public long getCreationTime() {
       return creationTime;
       }
      
       public Data getData() {
       return someData;
       }
      
       @Override
       public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
       creationTime = in.readLong();
       this.someData = (Data) in.readObject();
       }
      
       @Override
       public void writeExternal(ObjectOutput out) throws IOException {
       out.writeLong(creationTime);
       out.writeObject(someData);
       }
      }
      
      // In another class, notification sender code
      NodeServiceNotification sn = new NodeServiceNotification(someData);
      
       Notification notification = new Notification(NodeServiceNotification.NAME,
       node, System.currentTimeMillis());
       notification.setUserData(sn);
      
       this.sendNotification(notification);