2010-12-06 45 views
0

Je crée un test de stress pour mon application swing. swing app appel distance EJB méthode qui renvoie la liste des entités. Je mets l'invocation de méthode à distance en boucle et régler l'itération max 5000 appels au serveur, après que je lance 2 clients, mais après un certain nombre d'appels, un serveur throws ExceptionException inconnue lors de l'invocation de la méthode ejb

serveur d'application 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 

retourne méthode EJB entité dossiers

@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); 
    } 
} 

Dans la méthode EJB créer récursion sélectionnez des entités de dossier avec elle CHILDES. Entité de dossier dans la base de données mappée à son entité parente par l'objet parentFolderId.

@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); 
      } 
     } 
    } 

    } 

J'utilise la méthode removeAllChildes() à partir des dossiers d'entité pour supprimer Childs préalablement sélectionnés pour le dossier

Quelqu'un peut-il aider?

Répondre

0

Le problème semble être qu'une liste de listes est sérialisé et modifié en même temps par deux threads différents. La sérialisation est due à l'appel EJB à distance, mais de dire où la modification est, nous aurions besoin de voir le code

Basé sur le fait que vous avez deux d'entre eux dans votre trace de la pile

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

Avez-vous une liste de listes en tant que membre de votre classe EJB? Est-ce que vous le modifiez dans l'appel EJB et le renvoyez?

+0

J'ai une méthode dans l'entité qui supprime les élémets de liste du champ transiant. L'invocation de cette méthode se produit dans la méthode ejb. – dimitri

+0

Je pense que l'annotation @Transient est différente du mot-clé transitoire. Essayez 'privé transitoire Liste chileFolders ...' – karoberts