2010-12-06 2 views
0

Ich erstelle einen Stresstest für meine Swing-App. Swing App Call Remote EJB-Methode, die Liste der Entitäten zurückgibt. Ich habe Fernaufrufverfahren für Schleife und max Iteration bis 5000 Anrufe Server festgelegt, danach I ausgeführt 2 Kunden, sondern nach einer gewissen Anzahl von Anrufen, Server löst AusnahmeUnbekannte Ausnahme beim Aufruf der EJB-Methode

Anwendungsserver Glassfish 3,01 B22

WARNING: "IOP00010202: (UNKNOWN) Unknown user exception thrown by the server - exception: java.util.ConcurrentModificationException; message: null" 
org.omg.CORBA.UNKNOWN: vmcid: SUN minor code: 202 completed: Maybe 
    at com.sun.corba.ee.impl.logging.ORBUtilSystemException.runtimeexception(ORBUtilSystemException.java:11015) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.convertThrowableToSystemException(CorbaMessageMediatorImpl.java:2075) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleThrowableDuringServerDispatch(CorbaMessageMediatorImpl.java:2025) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleThrowableDuringServerDispatch(CorbaMessageMediatorImpl.java:1978) 
    at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:289) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1841) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1695) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1078) 
    at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:221) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:797) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:561) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2558) 
    at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:492) 
    at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:528) 
Caused by: java.util.ConcurrentModificationException 
    at java.util.ArrayList.writeObject(ArrayList.java:573) 
    at sun.reflect.GeneratedMethodAccessor35.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.invokeObjectWriter(IIOPOutputStream.java:760) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.outputObject(IIOPOutputStream.java:716) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.simpleWriteObject(IIOPOutputStream.java:227) 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueInternal(ValueHandlerImpl.java:268) 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueWithVersion(ValueHandlerImpl.java:240) 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValue(ValueHandlerImpl.java:193) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.callWriteValue(CDROutputStream_1_0.java:932) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.writeRMIIIOPValueType(CDROutputStream_1_0.java:917) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:1044) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:1057) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:774) 
    at com.sun.corba.ee.impl.encoding.CDROutputObject.write_value(CDROutputObject.java:681) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.writeObjectField(IIOPOutputStream.java:887) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.outputClassFields(IIOPOutputStream.java:959) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.defaultWriteObjectDelegate(IIOPOutputStream.java:281) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.outputObject(IIOPOutputStream.java:718) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.simpleWriteObject(IIOPOutputStream.java:227) 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueInternal(ValueHandlerImpl.java:268) 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueWithVersion(ValueHandlerImpl.java:240) 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValue(ValueHandlerImpl.java:193) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.callWriteValue(CDROutputStream_1_0.java:932) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.writeRMIIIOPValueType(CDROutputStream_1_0.java:917) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:1044) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:1057) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_abstract_interface(CDROutputStream_1_0.java:760) 
    at com.sun.corba.ee.impl.encoding.CDROutputObject.write_abstract_interface(CDROutputObject.java:709) 
    at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.writeAbstractObject(Util.java:501) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.writeObjectOverride(IIOPOutputStream.java:197) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:322) 
    at java.util.ArrayList.writeObject(ArrayList.java:570) 
    at sun.reflect.GeneratedMethodAccessor35.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.invokeObjectWriter(IIOPOutputStream.java:760) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.outputObject(IIOPOutputStream.java:716) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.simpleWriteObject(IIOPOutputStream.java:227) 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueInternal(ValueHandlerImpl.java:268) 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueWithVersion(ValueHandlerImpl.java:240) 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValue(ValueHandlerImpl.java:193) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.callWriteValue(CDROutputStream_1_0.java:932) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.writeRMIIIOPValueType(CDROutputStream_1_0.java:917) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:1044) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:1057) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:774) 
    at com.sun.corba.ee.impl.encoding.CDROutputObject.write_value(CDROutputObject.java:681) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.writeObjectField(IIOPOutputStream.java:887) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.outputClassFields(IIOPOutputStream.java:959) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.defaultWriteObjectDelegate(IIOPOutputStream.java:281) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.outputObject(IIOPOutputStream.java:718) 
    at com.sun.corba.ee.impl.io.IIOPOutputStream.simpleWriteObject(IIOPOutputStream.java:227) 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueInternal(ValueHandlerImpl.java:268) 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueWithVersion(ValueHandlerImpl.java:240) 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValue(ValueHandlerImpl.java:193) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.callWriteValue(CDROutputStream_1_0.java:932) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.writeRMIIIOPValueType(CDROutputStream_1_0.java:917) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:1044) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:1057) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:774) 
    at com.sun.corba.ee.impl.encoding.CDROutputObject.write_value(CDROutputObject.java:681) 
    at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl$14.write(DynamicMethodMarshallerImpl.java:394) 
    at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.writeResult(DynamicMethodMarshallerImpl.java:490) 
    at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:180) 
    at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:682) 
    at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:216) 
    ... 9 more 

EJB-Methode gibt Folders Entity

@Entity 

    public class Folders implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Transient 
    private List<Folders> chileFolders = new ArrayList<Folders>(); 

    @Basic(optional = false) 
    @Column(name = "FOLDER_GROUP_ID", nullable = false, unique = false) 
    private long parentFolderId; 

    //other attributes of folder entity 

    public Folders() { 
    } 

public List<Folders> getChildes() { 
    return chileFolders; 
} 

public void setChildes(List<Folders> foldersList) { 
    this.chileFolders = foldersList; 
} 

/** 
* removes all elements from transiant field {@link #chileFolders} 
*/ 
public void removeAllChildes() { 
    chileFolders.removeAll(chileFolders); 
    } 
} 

In EJB Methode, die ich Rekursion select von Ordner-Objekten erstellen Damit CHILDES. Die Ordnerentität in der Datenbank wurde der übergeordneten Entität durch das parentFolderId-Objekt zugeordnet.

@Stateless 
    public class FolderManager implements FolderManagerRemote { 
    //remote ejb method 
    @Override 
    public Folders findRootFolder() throws RecordDoNotExistException { 
     //root folder 
     Folders tempRoot = new Folders(); 
     tempRoot.setId((long) 1); 
     tempRoot.setParentFolderId(0); 
     recursionSelectFromRootFolder(tempRoot); 
     return tempRoot; 
    } 
    //recursion select 
    private void recursionSelectFromRootFolder(Folders root) { 
     List<Folders> folderList = getChildes(root); 
     //maybe this is cause of exception ????? removeAllChildes() 
     root.removeAllChildes(); 
     for (Iterator iterator = folderList.iterator(); iterator.hasNext();) { 
      Folders folders = (Folders) iterator.next(); 
      List<Folders> childesOfRoot = root.getChildes(); 
      childesOfRoot.add(folders); 
      root.setChildes(childesOfRoot); 
      if (hasChildes(folders)) { 
       recursionSelectFromRootFolder(folders); 
      } 
     } 
    } 

    } 

Ich benutze removeAllChildes() -Methode von Ordnern Entity zuvor ausgewählten Childs für Ordner entfernen

Kann jemand helfen?

Antwort

0

Das Problem scheint zu sein, dass eine Liste von Listen gleichzeitig von zwei verschiedenen Threadsserialisiert und geändert wird. Die Serialisierung ist auf den Remote-EJB Anruf, aber zu sagen, wo die Modifikation ist, möchten wir einige Codes

Basierend auf der Tatsache sehen müssen, dass Sie in Ihrem Stack-Trace zwei von ihnen haben

at java.util.ArrayList.writeObject(ArrayList.java:570) 

Haben Sie eine Liste von Listen als Mitglied Ihrer EJB-Klasse? Ändern Sie es im EJB-Aufruf und geben Sie es zurück?

+0

Ich habe eine Methode in der Einheit, die List elemets aus dem transianten Feld entfernt. Der Aufruf dieser Methode erfolgt in der ejb-Methode. – dimitri

+0

Ich denke, die @Transient-Annotation unterscheidet sich von dem transienten Schlüsselwort. Versuchen Sie 'private transiente Liste chileFolders ...' – karoberts