1 Reply Latest reply on Jan 14, 2013 7:10 PM by Ron Sigal

    invoke frequency and classloader

    lio bod Newbie

      Hello world,

       

      I noticed a strange behaviour and i want to knwow if this has already been pointed or fixed.

       

      My client is invoking my remoting server by sending inside an InvocationRequest a parameter that is a complex object.

      In fact this object is complex only because it aggragates/composes other object.

      On server side, the "invoke" method of my ServerInvocationHandler, shall receive this parameter, cast it in its native (or parent) class and then shall execute it.

      (my complex object is not only made to structure passive data, but mainly to be ran).

       

      Most of the the time it works well.

      But, sometimes, for some mysterious reasons, it fails an i got the following message :

       

      java.lang.IllegalStateException: BaseClassLoader@38bce164{vfszip:[MYJBOOS_DIR]/deploy/[MY_APP.jar/} classLoader is

          not connected to a domain (probably undeployed?) for class sun.reflect.ConstructorAccessorImpl

        at org.jboss.classloader.spi.base.BaseClassLoader.loadClassFromDomain(BaseClassLoader.java:793)

                at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:441)

                at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

                at sun.misc.Unsafe.defineClass(Native Method)

                at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:45)

                at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:381)

                at java.security.AccessController.doPrivileged(Native Method)

                at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:377)

                at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:76)

                at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:30)

                at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

                at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

                at org.jboss.serial.classmetamodel.ClassMetaData.newInstance(ClassMetaData.java:337)

                at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:239)

                at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:412)

                at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:82)

                at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:643)

                at org.jboss.serial.persister.ArrayPersister.readObjectArray(ArrayPersister.java:196)

                at org.jboss.serial.persister.ArrayPersister.readData(ArrayPersister.java:172)

                at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:412)

                at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:82)

                at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:643)

                at org.jboss.serial.persister.RegularObjectPersister.readSlotWithFields(RegularObjectPersister.java:353)

                at org.jboss.serial.persister.RegularObjectPersister.defaultRead(RegularObjectPersister.java:273)

                at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:241)

                at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:412)

                at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:82)

                at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:643)

                at org.jboss.serial.persister.RegularObjectPersister.readSlotWithFields(RegularObjectPersister.java:353)

                at org.jboss.serial.persister.RegularObjectPersister.defaultRead(RegularObjectPersister.java:273)

                at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:241)

                at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:412)

                at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:82)

                at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:643)

                at org.jboss.serial.io.JBossObjectInputStream.readObjectOverride(JBossObjectInputStream.java:163)

                at java.io.ObjectInputStream.readObject(ObjectInputStream.java:344)

                at org.jboss.remoting.serialization.impl.jboss.JBossSerializationManager.receiveObject(JBossSerializationManager.java:189)

                at org.jboss.remoting.marshal.serializable.SerializableUnMarshaller.read(SerializableUnMarshaller.java:123)

                at org.jboss.remoting.transport.socket.ServerThread.versionedRead(ServerThread.java:853)

                at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:707)

                at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:697)

                at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:524)

                at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:232)

       

       

      Just like if the class wouldn't be in the jar...

       

       

      May I afford an case?

      It may happens if my code to be execuded (brought by my complex object and available in MY_APP.jar on server side) is very short (i.e quick) and if the load of this "invoke" method is important.

       

      It occures rarely if the complex object executes a long task even if it the ServerInvocationHandler is invocated many times (lauching the complex object instances treatments in parallel)

      It is systematic if the parallel treatments are fast, on the Nth invocation.

      Like if the class disapeared from the jar...

       

      On the beginning, i though it was more a jboss problem that needed a restart.

      But after few seconds (if the ServerInvocationHandler is no more requested - time to get cooler ;-)) it may re-work properly.

      And then it is able to refind the class in the jar...

       

      Humbly, my hypothesis is it may come from a question of load, of frequency...(size of queue between remoting mecanics and native jboss classcloader?)

       

      Does anyone faced this before?

      Will i have a chance to find it out? and to get a workaroud?


      For information, i'm still using jboss 5.1.0.GA and i'd like not to upgrade its integrated libs jboss-remoting-2_5_1 and jboss-serialization-1.0.3.GA.

       

      Any advice/hint is welcome,

       

      Thx.