Uploaded image for project: 'Application Server 3  4  5 and 6'
  1. Application Server 3 4 5 and 6
  2. JBAS-3337

ClassNotFoundException during cache invalidation (option D) of EJBs with composite primary keys

    XMLWordPrintable

Details

    • Bug
    • Resolution: Obsolete
    • Major
    • No Release
    • JBossAS-3.2.7 Final, JBossAS-4.0.4.GA
    • Clustering, EJB, EJB2
    • None
    • High
    • Workaround Exists
    • Hide

      The workaround for this is to place your PK classes in server/all/lib. Not very nice.

      Show
      The workaround for this is to place your PK classes in server/all/lib. Not very nice.

    Description

      When using ejb containers like "Standard CMP 2.x EntityBean with cache invalidation" (or similar) with option D in clustered environment we encounter ClassNotFoundException when one of our servers modify data (with composite PK) and the other one receives "invalidate" message. Then the other one prints something like this:

      ================================
      2006-06-23 16:19:09,325 WARN [org.jboss.ha.framework.interfaces.HAPartition.DefaultPartition] failed unserializing message buffer (msg=[dst: 228.1.2.3:45566, src: metria:45663 (additional data: 19 bytes) (2 headers), size = 682 bytes])
      java.lang.ClassNotFoundException: No ClassLoaders found for: com.swps.metria.ejb.PKs.MetriaParametryUzytkownikaPK
      at org.jboss.mx.loading.LoadMgr3.beginLoadTask(LoadMgr3.java:212)
      at org.jboss.mx.loading.RepositoryClassLoader.loadClassImpl(RepositoryClassLoader.java:511)
      at org.jboss.mx.loading.RepositoryClassLoader.loadClass(RepositoryClassLoader.java:405)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:262)
      at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:322)
      at java.lang.Class.forName0(Native Method)
      at java.lang.Class.forName(Class.java:207)
      at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:551)
      at org.jboss.invocation.MarshalledValueInputStream.resolveClass(MarshalledValueInputStream.java:109)
      at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1503)
      at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1425)
      at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1616)
      at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1264)
      at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1593)
      at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1261)
      at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1830)
      at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1756)
      at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1636)
      at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1264)
      at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1593)
      at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1261)
      at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1593)
      at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1261)
      at java.io.ObjectInputStream.readObject(ObjectInputStream.java:322)
      at org.jgroups.blocks.MethodCall.readExternal(MethodCall.java:370)
      at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1676)
      at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1634)
      at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1264)
      at java.io.ObjectInputStream.readObject(ObjectInputStream.java:322)
      at org.jboss.ha.framework.server.HAPartitionImpl.objectFromByteBuffer(HAPartitionImpl.java:145)
      at org.jboss.ha.framework.server.HAPartitionImpl.handle(HAPartitionImpl.java:967)
      at org.jgroups.blocks.RequestCorrelator.handleRequest(RequestCorrelator.java:615)
      at org.jgroups.blocks.RequestCorrelator.receiveMessage(RequestCorrelator.java:512)
      at org.jgroups.blocks.RequestCorrelator.receive(RequestCorrelator.java:326)
      at org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.handleUp(MessageDispatcher.java:722)
      at org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.access$300(MessageDispatcher.java:554)
      at org.jgroups.blocks.MessageDispatcher$1.run(MessageDispatcher.java:691)
      at java.lang.Thread.run(Thread.java:536)
      ==================================

      Our app (EJB + PKs, WAR) is packed into Metria.ear and we use jboss-app.xml:
      ==========================
      <?xml version="1.0" encoding="UTF-8"?>
      <jboss-app>
      <loader-repository>
      swps.edu.pl:loader=Metria.ear
      <loader-repository-config>
      java2ParentDelegation=true
      </loader-repository-config>
      </loader-repository>
      </jboss-app>
      ==========================

      Our app uses only cache-invalidation to propagate data modifications messages beetwen 2 servers (no clustered EJBs and no clustered HTTP sessions).
      Shouldn't the right classloader be detected automatically? Or there is something wrong with the app? Nevertheless invalidation works but there could be some potential dangerous situations.

      Best regards
      Przemek

      Attachments

        Activity

          People

            bstansbe@redhat.com Brian Stansberry
            przemekd_jira A A (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: