Many thanks for the help.

After 10 years of development with WebObjects, many times reading the holy book 
(Practical WebObjects !), I finaly understand EOEditingContext and 
EOObjectCoordinator and the reason why my app was deadlocked.

It is a small step for Chuck (is it even a step ?), but a big for me.

Jérémy

Le 11 juil. 2013 à 00:48, Jérémy DE ROYER a écrit :

> Yes, I will change it.
> 
> Thank's Chuck.
> 
> Jérémy
> 
> Le 10 juil. 2013 à 23:52, Chuck Hill a écrit :
> 
>> What would be best is if MyAppCRMAnnuaireContact.email() passed in its own 
>> editing context (using the editingContext() method) to 
>> MyAppCRMParametres.getValeurForParametre rather than keeping an editing 
>> context in the application object.
>> 
>> Chuck
>> 
>> 
>> On 2013-07-10, at 2:18 PM, Jérémy DE ROYER wrote:
>> 
>>> 
>>>     public synchronized String getValeurForParametre(String keyIn)
>> 
>>      public synchronized String getValeurForParametre(EOEditingContext ec, 
>> String keyIn)
>> 
>>>     {
>>>             String strOut = (String) 
>>> _dictionnaireForParametres.objectForKey(keyIn);
>>> 
>>>             if (strOut == null)
>>>             {
>>>                     //                      log.info("Fetch key '" + keyIn 
>>> + "'");
>>>                     //
>>>                     try {
>>>                             strOut = ((MyAppParametre) 
>>> EOUtilities.objectWithPrimaryKeyValue(_editingContextForMyAppParametre(), 
>>> MyAppParametre.ENTITY_NAME, keyIn)).value();
>> 
>>                              strOut = ((MyAppParametre) 
>> EOUtilities.objectWithPrimaryKeyValue(ec,  MyAppParametre.ENTITY_NAME, 
>> keyIn)).value();
>> 
>> 
>>> 
>>>                             if (strOut == null)
>>>                             {
>>>                                     
>>> _dictionnaireForParametres.setObjectForKey("", keyIn);
>>>                             }
>>>                             else
>>>                             {
>>>                                     
>>> _dictionnaireForParametres.setObjectForKey(strOut, keyIn);
>>>                             }
>>>                     }
>>>                     catch (EOObjectNotAvailableException e) {
>>>                     }
>>>                     catch (Exception e) {
>>>                             e.printStackTrace();
>>>                     }
>>>             }
>>> 
>>>             return strOut;
>>>     }
>>> 
>>>     private synchronized EOEditingContext 
>>> _editingContextForMyAppParametre() {
>>> 
>>>             if (_editingContextForMyAppParametre == null)
>>>             {
>>>                     _editingContextForMyAppParametre = new 
>>> EOEditingContext();
>>>             }
>>> 
>>>             return _editingContextForMyAppParametre;
>>>     }
>>> 
>>> but am I right if I say that the codebelow should be better ?
>>> 
>>>     private synchronized EOEditingContext 
>>> _editingContextForMyAppParametre() {
>>> 
>>>             if (_editingContextForMyAppParametre == null)
>>>             {
>>>                     EOObjectStoreCoordinator parentObjectStore = new 
>>> EOObjectStoreCoordinator();
>>>                     _editingContextForMyAppParametre = new 
>>> EOEditingContext(parentObjectStore);
>>>             }
>>> 
>>>             return _editingContextForMyAppParametre;
>>>     }
>>> 
>>> or directly ?
>>> 
>>>     public synchronized String getValeurForParametre(String keyIn)
>>>     {
>>>             String strOut = (String) 
>>> _dictionnaireForParametres.objectForKey(keyIn);
>>> 
>>>             if (strOut == null)
>>>             {
>>>                     //                      log.info("Fetch key '" + keyIn 
>>> + "'");
>>>                     //
>>>                     try {
>>>                             EOObjectStoreCoordinator parentObjectStore = 
>>> new EOObjectStoreCoordinator();
>>>                             EOEditingContext 
>>> _editingContextForMyAppParametre = new EOEditingContext(parentObjectStore);
>>>                             _editingContextForMyAppParametre.lock()
>>> 
>>>                             strOut = ((MyAppParametre) 
>>> EOUtilities.objectWithPrimaryKeyValue(_editingContextForMyAppParametre, 
>>> MyAppParametre.ENTITY_NAME, keyIn)).value();
>>> 
>>>                             if (strOut == null)
>>>                             {
>>>                                     
>>> _dictionnaireForParametres.setObjectForKey("", keyIn);
>>>                             }
>>>                             else
>>>                             {
>>>                                     
>>> _dictionnaireForParametres.setObjectForKey(strOut, keyIn);
>>>                             }
>>> 
>>>                             _editingContextForMyAppParametre.unlock();
>>>                             _editingContextForMyAppParametre.dispose();
>>>                     }
>>>                     catch (EOObjectNotAvailableException e) {
>>>                     }
>>>                     catch (Exception e) {
>>>                             e.printStackTrace();
>>>                     }
>>>             }
>>> 
>>>             return strOut;
>>>     }
>>> 
>>> 
>>> Jérémy DE ROYER
>>> 
>>> Le 10 juil. 2013 à 23:00, Chuck Hill a écrit :
>>> 
>>>> On 2013-07-10, at 12:58 PM, Jérémy DE ROYER wrote:
>>>> 
>>>>> (I've added the method mymethod() in the thread to find the right Thread 
>>>>> in the stack)
>>>>> 
>>>>> Conclusion : I think that to get the email() value of the contact, my app 
>>>>> has to fetch a parameter value (using another editing context).
>>>> 
>>>> That does not sound like a good thing.  What is this code doing:
>>> 
>>> email() depends on the personal or professional email depending on a 
>>> parameter
>>> 
>>>> 
>>>>> - 
>>>>> com.myapp.myApp.MyAppApplication.getValeurForParametre(java.lang.String) 
>>>>> @bci=0, line=1915 (Interpreted frame)
>>>>> - 
>>>>> com.myapp.myAppCRM.core.MyAppCRMParametres.getValeurForParametre(java.lang.String)
>>>>>  @bci=7, line=122 (Interpreted frame)
>>>>> - com.myapp.myAppCRM.informations.MyAppCRMAnnuaireContact.email() @bci=8, 
>>>>> line=1556 (Interpreted frame)
>>>> 
>>>> 
>>>> 
>>>> Where is it getting the EC from?
>>> 
>>> a singleton method in myapp
>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>>> 
>>>>> Question, I replace 
>>>>> 
>>>>>                           EOEditingContext _localContext = new 
>>>>> EOEditingContext();
>>>>>                           _localContext.setUndoManager(null);
>>>>>                           _localContext.lock();
>>>>> 
>>>>> with 
>>>>> 
>>>>>                           EOObjectStoreCoordinator parentObjectStore = 
>>>>> new EOObjectStoreCoordinator();
>>>>>                           EOEditingContext _localContext = new 
>>>>> EOEditingContext(parentObjectStore);
>>>>>                           _localContext.setUndoManager(null);
>>>>>                           _localContext.lock();
>>>>> 
>>>>> And it works ! Is it normal ?
>>>> 
>>>> That sounds like it is working around a defect in your code.
>>> 
>>> Yes
>>> 
>>>> 
>>>> 
>>>> Chuck
>>>> 
>>>> 
>>>>> 
>>>>> Jérémy
>>>>> 
>>>>> JVM version is 20.51-b01-457
>>>>> Deadlock Detection:
>>>>> 
>>>>> java.lang.RuntimeException: Unable to deduce type of thread from address 
>>>>> 0x00007f87be87d800 (expected type JavaThread, CompilerThread, 
>>>>> LowMemoryDetectorThread, JvmtiAgentThread, or SurrogateLockerThread)
>>>>>   at 
>>>>> sun.jvm.hotspot.runtime.Threads.createJavaThreadWrapper(Threads.java:155)
>>>>>   at sun.jvm.hotspot.runtime.JavaThread.next(JavaThread.java:118)
>>>>>   at 
>>>>> sun.jvm.hotspot.runtime.DeadlockDetector.createThreadTable(DeadlockDetector.java:149)
>>>>>   at 
>>>>> sun.jvm.hotspot.runtime.DeadlockDetector.print(DeadlockDetector.java:56)
>>>>>   at 
>>>>> sun.jvm.hotspot.runtime.DeadlockDetector.print(DeadlockDetector.java:39)
>>>>>   at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:52)
>>>>>   at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:45)
>>>>>   at sun.jvm.hotspot.tools.JStack.run(JStack.java:60)
>>>>>   at sun.jvm.hotspot.tools.Tool.start(Tool.java:221)
>>>>>   at sun.jvm.hotspot.tools.JStack.main(JStack.java:88)
>>>>>   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>>   at 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>>>   at 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>>>   at java.lang.reflect.Method.invoke(Method.java:597)
>>>>>   at sun.tools.jstack.JStack.runJStackTool(JStack.java:118)
>>>>>   at sun.tools.jstack.JStack.main(JStack.java:84)
>>>>> Caused by: sun.jvm.hotspot.types.WrongTypeException: No suitable match 
>>>>> for type of address 0x00007f87be87d800
>>>>>   at 
>>>>> sun.jvm.hotspot.runtime.VirtualConstructor.instantiateWrapperFor(VirtualConstructor.java:95)
>>>>>   at 
>>>>> sun.jvm.hotspot.runtime.Threads.createJavaThreadWrapper(Threads.java:151)
>>>>>   ... 15 more
>>>>> Can't print deadlocks:Unable to deduce type of thread from address 
>>>>> 0x00007f87be87d800 (expected type JavaThread, CompilerThread, 
>>>>> LowMemoryDetectorThread, JvmtiAgentThread, or SurrogateLockerThread)
>>>>> 
>>>>> Thread t@47363: (state = BLOCKED)
>>>>> - 
>>>>> com.myapp.myApp.MyAppApplication.getValeurForParametre(java.lang.String) 
>>>>> @bci=0, line=1915 (Interpreted frame)
>>>>> - 
>>>>> com.myapp.myAppCRM.core.MyAppCRMParametres.getValeurForParametre(java.lang.String)
>>>>>  @bci=7, line=122 (Interpreted frame)
>>>>> - com.myapp.myAppCRM.informations.MyAppCRMAnnuaireContact.email() @bci=8, 
>>>>> line=1556 (Interpreted frame)
>>>>> - sun.reflect.NativeMethodAccessorImpl.invoke0(java.lang.reflect.Method, 
>>>>> java.lang.Object, java.lang.Object[]) @bci=0 (Interpreted frame)
>>>>> - sun.reflect.NativeMethodAccessorImpl.invoke(java.lang.Object, 
>>>>> java.lang.Object[]) @bci=87, line=39 (Interpreted frame)
>>>>> - sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, 
>>>>> java.lang.Object[]) @bci=6, line=25 (Compiled frame)
>>>>> - java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) 
>>>>> @bci=161, line=597 (Compiled frame)
>>>>> - 
>>>>> com.webobjects.foundation.NSKeyValueCoding$ValueAccessor$1.methodValue(java.lang.Object,
>>>>>  java.lang.reflect.Method) @bci=6, line=636 (Compiled frame)
>>>>> - 
>>>>> com.webobjects.foundation.NSKeyValueCoding$_MethodBinding.valueInObject(java.lang.Object)
>>>>>  @bci=9, line=1134 (Compiled frame)
>>>>> - com.webobjects.eocontrol.EOCustomObject.valueForKey(java.lang.String) 
>>>>> @bci=14, line=1498 (Interpreted frame)
>>>>> - 
>>>>> com.myapp.myApp.editing.EOGenericStateTransitionRecord.valueForKey(java.lang.String)
>>>>>  @bci=80, line=109 (Interpreted frame)
>>>>> - com.webobjects.eocontrol.EOCustomObject.validateForSave() @bci=120, 
>>>>> line=1377 (Interpreted frame)
>>>>> - com.webobjects.eocontrol.EOCustomObject.validateForUpdate() @bci=1, 
>>>>> line=1446 (Interpreted frame)
>>>>> - 
>>>>> com.webobjects.eocontrol.EOEditingContext.validateTable(com.webobjects.foundation.NSSet,
>>>>>  int, com.webobjects.foundation.NSMutableArray[], boolean) @bci=72, 
>>>>> line=2271 (Interpreted frame)
>>>>> - com.webobjects.eocontrol.EOEditingContext.validateChangesForSave() 
>>>>> @bci=175, line=3020 (Interpreted frame)
>>>>> - com.webobjects.eocontrol.EOEditingContext._prepareForPushChanges() 
>>>>> @bci=141, line=3249 (Interpreted frame)
>>>>> - com.webobjects.eocontrol.EOEditingContext.saveChanges() @bci=38, 
>>>>> line=3179 (Interpreted frame)
>>>>> - 
>>>>> com.myapp.myAppMatching.components.pages.MyAppMatchingPageParametres$2.run()
>>>>>  @bci=286, line=2786 (Interpreted frame)
>>>>> - java.lang.Thread.run() @bci=11, line=680 (Interpreted frame)
>>>>> 
>>>>> Le 10 juil. 2013 à 21:29, Chuck Hill a écrit :
>>>>> 
>>>>>> The  best thing to do is to cause a deadlock and then get a thread dump 
>>>>>> with
>>>>>> 
>>>>>> sudo jstack -F <process ID>
>>>>>> 
>>>>>> That should make it much faster to track down.
>>>>>> 
>>>>>> 
>>>>>> Chuck
>>>>>> 
>>>>>> 
>>>>>> On 2013-07-10, at 12:23 PM, Jérémy DE ROYER wrote:
>>>>>> 
>>>>>>> Hi all,
>>>>>>> 
>>>>>>> Following a case that hang my application which blocks all transactions 
>>>>>>> until we restart. I just managed to reproduce the case study below that 
>>>>>>> hangs my application too.
>>>>>>> 
>>>>>>> Case : I have to update objects outside the user request/response loop.
>>>>>>> 
>>>>>>> Code A
>>>>>>> ===
>>>>>>> 
>>>>>>> I use an action inside a component (live process) : everything works 
>>>>>>> great.
>>>>>>> 
>>>>>>> public WOComponent myAction() {
>>>>>>> 
>>>>>>> EOEditingContext _localContext = new EOEditingContext();
>>>>>>> _localContext.setUndoManager(null);
>>>>>>> _localContext.lock();
>>>>>>> 
>>>>>>> EOCompany currentCompany;
>>>>>>> 
>>>>>>> NSArray<EOEnterpriseObject> _localCompanies = 
>>>>>>> EOCompany.fetchEOCompanies(_localContext, 
>>>>>>> new EOKeyValueQualifier(EOCompany.CONTACT_KEY, 
>>>>>>> EOQualifier.QualifierOperatorEqual, null), 
>>>>>>> new NSArray<EOSortOrdering>(new EOSortOrdering(EOCompany.TITLE_KEY, 
>>>>>>> EOSortOrdering.CompareAscending)));
>>>>>>> 
>>>>>>> for (int i=0 ; i<_localObjects.count() ; i++)
>>>>>>> {
>>>>>>> currentCompany = _localCompanies.objectAtIndex(i);
>>>>>>> 
>>>>>>> if (currentCompany.headquarter() != null)
>>>>>>> {
>>>>>>> currentCompany.setContactRelationship(currentCompany.headquarter().contact());
>>>>>>> }
>>>>>>> 
>>>>>>> try {
>>>>>>> log.info("start saveChanges"); 
>>>>>>> _localContext.saveChanges();
>>>>>>> log.info("end saveChanges"); 
>>>>>>> }
>>>>>>> catch (Exception e) {
>>>>>>> 
>>>>>>> e.printStackTrace();
>>>>>>> 
>>>>>>> _localContext.revert();
>>>>>>> }
>>>>>>> }
>>>>>>> }
>>>>>>> 
>>>>>>> }
>>>>>>> catch (Exception e) {
>>>>>>> 
>>>>>>> e.printStackTrace();
>>>>>>> }
>>>>>>> finally {
>>>>>>> 
>>>>>>> _localContext.unlock();
>>>>>>> _localContext.dispose();
>>>>>>> }
>>>>>>> }
>>>>>>> 
>>>>>>> (SQL log below)
>>>>>>> 
>>>>>>> 2013-07-10 20:53:03,462 INFO [IndeXysMatchingPageParametres] - <start 
>>>>>>> saveChanges>
>>>>>>> [...]
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10> 0 row(s) processed
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  === Commit Internal 
>>>>>>> Transaction
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  === Begin Internal 
>>>>>>> Transaction
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  evaluateExpression: 
>>>>>>> <com.webobjects.jdbcadaptor.FrontbasePlugIn$FrontbaseExpression: 
>>>>>>> "SELECT t0."ADRESSE", t0."ADRESSE_2", t0."CODE_ACTION", 
>>>>>>> t0."CODE_POSTAL", t0."DATE_CLOTURE", t0."DATE_CREATION", 
>>>>>>> t0."DATE_DEBUT", t0."DATE_DERNIERE_MODIFICATION", 
>>>>>>> t0."DATE_DERNIERE_MODIFICATION_ACTEUR", t0."DATE_FIN", 
>>>>>>> t0."DATE_FIN_REPETITION", t0."DUREE_CONSTATEE", t0."EST_INTERNE", 
>>>>>>> t0."EST_PRIVE", t0."EST_TERMINE", t0."ID", t0."ID_ACTEUR", 
>>>>>>> t0."ID_ACTEUR_CLOTURE", t0."ID_AUTEUR", 
>>>>>>> t0."ID_AUTEUR_DERNIERE_MODIFICATION", t0."ID_CAMPAGNE", 
>>>>>>> t0."ID_COMPTE_RENDU_CLOTURE", t0."ID_CONTACT", 
>>>>>>> t0."ID_ENTREE_ORGANISATEUR", t0."ID_ENTREE_ORIGINALE_REPETITION", 
>>>>>>> t0."ID_ENTREPRISE", t0."ID_EVENEMENT", t0."ID_RESSOURCE", 
>>>>>>> t0."IS_VALID", t0."PRIORITE", t0."REFERENCE", t0."STATUT", t0."TITRE", 
>>>>>>> t0."TYPE_ACTIVITE", t0."VILLE" FROM 
>>>>>>> "INDEXYS_GESTION_ACTIVITE_ABSTRACT_ACTION" t0 WHERE t0."ID_CONTACT" = 
>>>>>>> 1000034" withBindings: >
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10> 0 row(s) processed
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  === Commit Internal 
>>>>>>> Transaction
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  === Begin Internal 
>>>>>>> Transaction
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  evaluateExpression: 
>>>>>>> <com.webobjects.jdbcadaptor.FrontbasePlugIn$FrontbaseExpression: 
>>>>>>> "SELECT t0."CODE_NOTE_DE_FRAIS", t0."DATE_CREATION", 
>>>>>>> t0."DATE_DECISION", t0."DATE_DERNIERE_MODIFICATION", 
>>>>>>> t0."DATE_NOTE_DE_FRAIS", t0."EST_SOLDEE", t0."ID", t0."ID_ACTEUR", 
>>>>>>> t0."ID_ACTEUR_SOLDE", t0."ID_ACTION", t0."ID_AFFAIRE", t0."ID_AUTEUR", 
>>>>>>> t0."ID_AUTEUR_DECISION", t0."ID_AUTEUR_DERNIERE_MODIFICATION", 
>>>>>>> t0."ID_CAMPAGNE", t0."ID_CLASSE_NOTE_DE_FRAIS", t0."ID_COMMANDE", 
>>>>>>> t0."ID_CONTACT", t0."ID_DEVIS", t0."ID_ENTREPRISE", t0."ID_EVENEMENT", 
>>>>>>> t0."ID_FACTURE", t0."ID_FORFAIT_NOTE_DE_FRAIS", t0."ID_OPPORTUNITE", 
>>>>>>> t0."ID_ORGANISATION", t0."ID_PARTITION", t0."ID_PROJET", t0."ID_TYPE", 
>>>>>>> t0."IS_VALID", t0."MONTANT_HT", t0."MONTANT_TTC", 
>>>>>>> t0."NOMBRE_KILOMETRE", t0."NOMBRE_PERSONNE", t0."REFERENCE", 
>>>>>>> t0."STATUT", t0."TITRE", t0."TYPE_DECISION" FROM 
>>>>>>> "INDEXYS_CRM_GESTION_ACTIVITE_NOTE_DE_FRAIS" t0 WHERE 
>>>>>>> t0."ID_ENTREPRISE" = 1000034" withBindings: >
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10> 0 row(s) processed
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  === Commit Internal 
>>>>>>> Transaction
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  === Begin Internal 
>>>>>>> Transaction
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  evaluateExpression: 
>>>>>>> <com.webobjects.jdbcadaptor.FrontbasePlugIn$FrontbaseExpression: 
>>>>>>> "SELECT t0."EST_INACTIVE", t0."ID", t0."ID_ABONNE", 
>>>>>>> t0."ID_ADRESSE_EMAIL", t0."ID_CAMPAGNE", t0."ID_CONTACT", 
>>>>>>> t0."ID_DERNIER_ENVOI", t0."ID_DERNIER_ENVOI_ACCESSED", 
>>>>>>> t0."ID_DERNIER_ENVOI_ACCESSED_SINCE_LAST_RESET", 
>>>>>>> t0."ID_DERNIER_ENVOI_DOWNLOADED", 
>>>>>>> t0."ID_DERNIER_ENVOI_DOWNLOADED_SINCE_LAST_RESET", 
>>>>>>> t0."ID_DERNIER_ENVOI_READ", 
>>>>>>> t0."ID_DERNIER_ENVOI_READ_SINCE_LAST_RESET", 
>>>>>>> t0."ID_DERNIER_ENVOI_SINCE_LAST_RESET", 
>>>>>>> t0."ID_DERNIER_ENVOI_UNSUBSCRIBE", 
>>>>>>> t0."ID_DERNIER_ENVOI_UNSUBSCRIBE_SINCE_LAST_RESET", 
>>>>>>> t0."ID_DERNIER_ERREUR", t0."ID_DERNIER_ERREUR_SINCE_LAST_RESET", 
>>>>>>> t0."ID_ENTREPRISE", t0."ID_UTILISATEUR", t0."LAST_ACCESSED", 
>>>>>>> t0."LAST_DOWNLOADED", t0."LAST_READ", t0."LAST_UNSUBSCRIBE", 
>>>>>>> t0."NOMBRE_CONSULTATION", t0."NOMBRE_CONSULTATION_SINCE_LAST_RESET", 
>>>>>>> t0."NOMBRE_LIEN_INTERNET", t0."NOMBRE_LIEN_INTERNET_SINCE_LAST_RESET" 
>>>>>>> FROM "INDEXYS_EMAILING_PARTICIPATION" t0 WHERE t0."ID_CONTACT" = 
>>>>>>> 1000034" withBindings: >
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10> 0 row(s) processed
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  === Commit Internal 
>>>>>>> Transaction
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  === Begin Internal 
>>>>>>> Transaction
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  evaluateExpression: 
>>>>>>> <com.webobjects.jdbcadaptor.FrontbasePlugIn$FrontbaseExpression: 
>>>>>>> "UPDATE "INDEXYS_MATCHING_COMMANDE_CLIENT" SET "ID_CONTACT" = 1000034, 
>>>>>>> "ID_ENTREPRISE_CLIENT" = 1000027 WHERE ("ID" = 1000526 AND 
>>>>>>> "CODE_COMMANDE" = 'MON-CODE' AND "CODE_CONFIRMATION_PAIEMENT" = 830 AND 
>>>>>>> "CODE_PARRAINAGE" is NULL AND "CODE_PROMOTION" is NULL AND 
>>>>>>> "DATE_ANNULATION" is NULL AND "DATE_COMMANDE" = TIMESTAMP '2013-03-21 
>>>>>>> 18:31:03.000' AND "DATE_CONFIRMATION_FACTURATION" = TIMESTAMP 
>>>>>>> '2013-03-21 18:59:23.000' AND "DATE_CONFIRMATION_PAIEMENT" = TIMESTAMP 
>>>>>>> '2013-03-21 18:52:13.000' AND "DATE_CREATION" = TIMESTAMP '2013-03-21 
>>>>>>> 18:31:02.000' AND "DATE_DEBUT" is NULL AND "DATE_DERNIERE_FACTURE_CLI" 
>>>>>>> = TIMESTAMP '2013-03-21 18:59:23.000' AND "DATE_DERNIERE_FACTURE_FOU" 
>>>>>>> is NULL AND "DATE_DERNIERE_MODIFICATION" = TIMESTAMP '2013-03-21 
>>>>>>> 18:59:18.000' AND "DATE_FIN" is NULL AND "DATE_SOLDE" = TIMESTAMP 
>>>>>>> '2013-03-21 18:52:13.000' AND "DATE_VALIDATION" = TIMESTAMP '2013-03-21 
>>>>>>> 18:50:58.000' AND "DEVISE" = '€' AND "EST_SOLDEE" is NULL AND 
>>>>>>> "ETAT_COMMANDE" is NULL AND "ID_ACTEUR" is NULL AND "ID_AFFAIRE" is 
>>>>>>> NULL AND "ID_AUTEUR" = 1000215 AND "ID_AUTEUR_ANNULATION" = 1000002 AND 
>>>>>>> "ID_AUTEUR_COMMANDE" = 1000215 AND "ID_AUTEUR_CONFIRMATION_FACTURATION" 
>>>>>>> is NULL AND "ID_AUTEUR_CONFIRMATION_PAIEMENT" is NULL AND 
>>>>>>> "ID_AUTEUR_DERNIERE_MODIFICATION" = 1000002 AND "ID_AUTEUR_SOLDE" is 
>>>>>>> NULL AND "ID_AUTEUR_VALIDATION" = 1000002 AND "ID_AUTORISATION" is NULL 
>>>>>>> AND "ID_CAMPAGNE" is NULL AND "ID_CLIENT" = 1000215 AND 
>>>>>>> "ID_CLIENT_PARRAIN" is NULL AND "ID_CONTACT" is NULL AND "ID_DEVIS" is 
>>>>>>> NULL AND "ID_ENTREPRISE_CLIENT" is NULL AND "ID_EVENEMENT" = 1000044 
>>>>>>> AND "ID_OPPORTUNITE" is NULL AND "MODE_PAIEMENT" = 2 AND 
>>>>>>> "POINTS_AJOUTES_FILLEUL" is NULL AND "POINTS_AJOUTES_PARRAIN" is NULL 
>>>>>>> AND "POINTS_CONSOMMES_PARRAIN" is NULL AND "PRIX_AVEC_TVA" = 0 AND 
>>>>>>> "REFERENCE" = 'da615844-3dd0-4a51-8201-4d7fd217548e' AND 
>>>>>>> "REFERENCE_AFFILIE" is NULL AND "REFERENCE_PROCESS" is NULL AND 
>>>>>>> "STATUT" is NULL AND "TITRE" is NULL AND "TYPE_COMMANDE" = 1 AND 
>>>>>>> "TYPE_PAIEMENT" = 2)" withBindings: >
>>>>>>> [2013-7-10 20:53:3 CEST] <WorkerThread10>  === Commit Internal 
>>>>>>> Transaction
>>>>>>> 2013-07-10 20:53:03,462 INFO [IndeXysMatchingPageParametres] - <end 
>>>>>>> saveChanges>
>>>>>>> 
>>>>>>> 
>>>>>>> Code B
>>>>>>> ===
>>>>>>> 
>>>>>>> I use the same action but include my process inside a thread (used to 
>>>>>>> display a AjaxProgessBar), the process never save the changes and my 
>>>>>>> application hangs… and the SQL log show it never updates
>>>>>>> 
>>>>>>> public WOComponent myAction() {
>>>>>>> 
>>>>>>> Thread _localThread = new Thread(new Runnable()
>>>>>>> {
>>>>>>> public void run() {
>>>>>>> 
>>>>>>> EOEditingContext _localContext = new EOEditingContext();
>>>>>>> _localContext.setUndoManager(null);
>>>>>>> _localContext.lock();
>>>>>>> 
>>>>>>> EOCompany currentCompany;
>>>>>>> 
>>>>>>> NSArray<EOEnterpriseObject> _localCompanies = 
>>>>>>> EOCompany.fetchEOObjects(_localContext, 
>>>>>>> new EOKeyValueQualifier(EOCompany.CONTACT_KEY, 
>>>>>>> EOQualifier.QualifierOperatorEqual, null), 
>>>>>>> new NSArray<EOSortOrdering>(new EOSortOrdering(EOCompany.TITLE_KEY, 
>>>>>>> EOSortOrdering.CompareAscending)));
>>>>>>> 
>>>>>>> for (int i=0 ; i<_localObjects.count() ; i++)
>>>>>>> {
>>>>>>> currentCompany = _localCompanies.objectAtIndex(i);
>>>>>>> 
>>>>>>> currentCompany.setContactRelationship(_localCompanies.headquarter().contact());
>>>>>>> 
>>>>>>> try {
>>>>>>> log.info("start saveChanges"); 
>>>>>>> _localContext.saveChanges();
>>>>>>> log.info("end saveChanges"); 
>>>>>>> }
>>>>>>> catch (Exception e) {
>>>>>>> 
>>>>>>> e.printStackTrace();
>>>>>>> 
>>>>>>> _localContext.revert();
>>>>>>> }
>>>>>>> }
>>>>>>> }
>>>>>>> 
>>>>>>> }
>>>>>>> catch (Exception e) {
>>>>>>> 
>>>>>>> e.printStackTrace();
>>>>>>> }
>>>>>>> finally {
>>>>>>> 
>>>>>>> _localContext.unlock();
>>>>>>> _localContext.dispose();
>>>>>>> }
>>>>>>> }
>>>>>>> });
>>>>>>> 
>>>>>>> _localThread.start();
>>>>>>> 
>>>>>>> return null;
>>>>>>> }
>>>>>>> 
>>>>>>> 2013-07-10 20:53:03,462 INFO [IndeXysMatchingPageParametres] - <start 
>>>>>>> saveChanges>
>>>>>>> [...]
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18> 0 row(s) processed
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18>  === Commit Internal Transaction
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18>  === Begin Internal Transaction
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18>  evaluateExpression: 
>>>>>>> <com.webobjects.jdbcadaptor.FrontbasePlugIn$FrontbaseExpression: 
>>>>>>> "SELECT t0."DATE_CREATION", t0."DATE_DERNIERE_MODIFICATION", 
>>>>>>> t0."DATE_INSCRIPTION", t0."EMAIL_INSCRIPTION_HAS_BEEN_SENT", t0."ID", 
>>>>>>> t0."ID_ACTEUR", t0."ID_AUTEUR", t0."ID_AUTEUR_DERNIERE_MODIFICATION", 
>>>>>>> t0."ID_COMMANDE_CLIENT", t0."ID_CONTACT", t0."ID_ENTREPRISE", 
>>>>>>> t0."ID_EVENEMENT", t0."ID_PARTITION", t0."ID_PERIODE_PRESENCE", 
>>>>>>> t0."ID_PROFIL_PROPOSE", t0."ID_PROFIL_INSCRIPTION", 
>>>>>>> t0."ID_PROFIL_INSCRIPTION_TARIF", t0."ID_PROFIL_PARTICIPATION", 
>>>>>>> t0."ID_PROFIL_RECHERCHE", t0."ID_TYPE", t0."ID_UTILISATEUR", 
>>>>>>> t0."IS_VALID", t0."LAST_LOGIN", t0."LAST_NOTIFICATION_CONTACTS", 
>>>>>>> t0."LAST_NOTIFICATION_INSCRIPTIONS", t0."LAST_UPDATE_JE_PROPOSE", 
>>>>>>> t0."LAST_UPDATE_JE_RECHERCHE", t0."LAST_UPDATE_JE_SUIS", 
>>>>>>> t0."LAST_UPDATE_VOEUX_EMIS", t0."NOTE", t0."REFERENCE", t0."STATUT" 
>>>>>>> FROM "INDEXYS_MATCHING_PARTICIPATION" t0 WHERE t0."ID_COMMANDE_CLIENT" 
>>>>>>> = 1000509" withBindings: >
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18> 1 row(s) processed
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18>  === Commit Internal Transaction
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18>  === Begin Internal Transaction
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18>  evaluateExpression: 
>>>>>>> <com.webobjects.jdbcadaptor.FrontbasePlugIn$FrontbaseExpression: 
>>>>>>> "SELECT t0."CREDIT_TTC", t0."DATE_CREATION", 
>>>>>>> t0."DATE_DERNIERE_MODIFICATION", t0."DATE_REGLEMENT", t0."DEBIT_TTC", 
>>>>>>> t0."DEVISE", t0."ID", t0."ID_AUTEUR", 
>>>>>>> t0."ID_AUTEUR_DERNIERE_MODIFICATION", t0."ID_CLIENT", t0."ID_COMMANDE", 
>>>>>>> t0."ID_CONTACT", t0."ID_ENTREPRISE", t0."ID_FACTURE", t0."ID_LETTRAGE", 
>>>>>>> t0."ID_MODE_REGLEMENT", t0."ID_ORGANISATION", t0."ID_PARTITION", 
>>>>>>> t0."REFERENCE" FROM "INDEXYS_GESTION_COMMERCIALE_REGLEMENT" t0 WHERE 
>>>>>>> t0."ID_COMMANDE" = 1000509" withBindings: >
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18> 0 row(s) processed
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18>  === Commit Internal Transaction
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18>  === Begin Internal Transaction
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18>  evaluateExpression: 
>>>>>>> <com.webobjects.jdbcadaptor.FrontbasePlugIn$FrontbaseExpression: 
>>>>>>> "SELECT t0."CODE_NOTE_DE_FRAIS", t0."DATE_CREATION", 
>>>>>>> t0."DATE_DECISION", t0."DATE_DERNIERE_MODIFICATION", 
>>>>>>> t0."DATE_NOTE_DE_FRAIS", t0."EST_SOLDEE", t0."ID", t0."ID_ACTEUR", 
>>>>>>> t0."ID_ACTEUR_SOLDE", t0."ID_ACTION", t0."ID_AFFAIRE", t0."ID_AUTEUR", 
>>>>>>> t0."ID_AUTEUR_DECISION", t0."ID_AUTEUR_DERNIERE_MODIFICATION", 
>>>>>>> t0."ID_CAMPAGNE", t0."ID_CLASSE_NOTE_DE_FRAIS", t0."ID_COMMANDE", 
>>>>>>> t0."ID_CONTACT", t0."ID_DEVIS", t0."ID_ENTREPRISE", t0."ID_EVENEMENT", 
>>>>>>> t0."ID_FACTURE", t0."ID_FORFAIT_NOTE_DE_FRAIS", t0."ID_OPPORTUNITE", 
>>>>>>> t0."ID_ORGANISATION", t0."ID_PARTITION", t0."ID_PROJET", t0."ID_TYPE", 
>>>>>>> t0."IS_VALID", t0."MONTANT_HT", t0."MONTANT_TTC", 
>>>>>>> t0."NOMBRE_KILOMETRE", t0."NOMBRE_PERSONNE", t0."REFERENCE", 
>>>>>>> t0."STATUT", t0."TITRE", t0."TYPE_DECISION" FROM 
>>>>>>> "INDEXYS_CRM_GESTION_ACTIVITE_NOTE_DE_FRAIS" t0 WHERE 
>>>>>>> t0."ID_ENTREPRISE" = 1000509" withBindings: >
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18> 0 row(s) processed
>>>>>>> [2013-7-10 20:58:3 CEST] <Thread-18>  === Commit Internal Transaction
>>>>>>> 
>>>>>>> Code C
>>>>>>> ===
>>>>>>> 
>>>>>>> I include a loop that prints each objects that will be updated : works 
>>>>>>> quite great (some few times, my app hangs).
>>>>>>> 
>>>>>>> public WOComponent myAction() {
>>>>>>> 
>>>>>>> Thread _localThread = new Thread(new Runnable()
>>>>>>> {
>>>>>>> public void run() {
>>>>>>> 
>>>>>>> EOEditingContext _localContext = new EOEditingContext();
>>>>>>> _localContext.setUndoManager(null);
>>>>>>> _localContext.lock();
>>>>>>> 
>>>>>>> EOCompany currentCompany;
>>>>>>> 
>>>>>>> NSArray<EOEnterpriseObject> _localCompanies = 
>>>>>>> EOCompany.fetchEOObjects(_localContext, 
>>>>>>> new EOKeyValueQualifier(EOCompany.CONTACT_KEY, 
>>>>>>> EOQualifier.QualifierOperatorEqual, null), 
>>>>>>> new NSArray<EOSortOrdering>(new EOSortOrdering(EOCompany.TITLE_KEY, 
>>>>>>> EOSortOrdering.CompareAscending)));
>>>>>>> 
>>>>>>> for (int i=0 ; i<_localObjects.count() ; i++)
>>>>>>> {
>>>>>>> currentCompany = _localCompanies.objectAtIndex(i);
>>>>>>> 
>>>>>>> currentCompany.setContactRelationship(_localCompanies.headquarter().contact());
>>>>>>> 
>>>>>>> try {
>>>>>>> for (int j=0 ; j<_localContext.updatedObjects().count() ; j++) { 
>>>>>>> log.info("_localContext.updatedObjects().objectAtIndex(j) >" + 
>>>>>>> _localContext.updatedObjects().objectAtIndex(j));
>>>>>>> } 
>>>>>>> 
>>>>>>> log.info("start saveChanges"); 
>>>>>>> _localContext.saveChanges();
>>>>>>> log.info("end saveChanges"); 
>>>>>>> }
>>>>>>> catch (Exception e) {
>>>>>>> 
>>>>>>> e.printStackTrace();
>>>>>>> 
>>>>>>> _localContext.revert();
>>>>>>> }
>>>>>>> }
>>>>>>> }
>>>>>>> 
>>>>>>> }
>>>>>>> catch (Exception e) {
>>>>>>> 
>>>>>>> e.printStackTrace();
>>>>>>> }
>>>>>>> finally {
>>>>>>> 
>>>>>>> _localContext.unlock();
>>>>>>> _localContext.dispose();
>>>>>>> }
>>>>>>> }
>>>>>>> });
>>>>>>> 
>>>>>>> _localThread.start();
>>>>>>> 
>>>>>>> return null;
>>>>>>> }
>>>>>>> 
>>>>>>> What's wrong with my code ?
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> Thank's for any help, these random deadlocks are very uncomfortable
>>>>>>> 
>>>>>>> Jérémy
>>>>>>> _______________________________________________
>>>>>>> Do not post admin requests to the list. They will be ignored.
>>>>>>> Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
>>>>>>> Help/Unsubscribe/Update your Subscription:
>>>>>>> https://lists.apple.com/mailman/options/webobjects-dev/chill%40global-village.net
>>>>>>> 
>>>>>>> This email sent to ch...@global-village.net
>>>>>> 
>>>>>> -- 
>>>>>> Chuck Hill             
>>>>>> Executive Managing Partner, VP Development and Technical Services
>>>>>> 
>>>>>> Practical WebObjects - for developers who want to increase their overall 
>>>>>> knowledge of WebObjects or who are trying to solve specific problems.    
>>>>>> http://www.global-village.net/gvc/practical_webobjects
>>>>>> 
>>>>>> Global Village Consulting ranks 13th in 2012 in BIV's Top 100 Fastest 
>>>>>> Growing Companies in B.C! 
>>>>>> 
>>>>>> Global Village Consulting ranks 44th in 25th annual PROFIT 500 ranking 
>>>>>> of Canada’s Fastest-Growing Companies by PROFIT Magazine!
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>>> -- 
>>>> Chuck Hill             
>>>> Executive Managing Partner, VP Development and Technical Services
>>>> 
>>>> Practical WebObjects - for developers who want to increase their overall 
>>>> knowledge of WebObjects or who are trying to solve specific problems.    
>>>> http://www.global-village.net/gvc/practical_webobjects
>>>> 
>>>> Global Village Consulting ranks 13th in 2012 in BIV's Top 100 Fastest 
>>>> Growing Companies in B.C! 
>>>> 
>>>> Global Village Consulting ranks 44th in 25th annual PROFIT 500 ranking of 
>>>> Canada’s Fastest-Growing Companies by PROFIT Magazine!
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>> 
>> 
>> -- 
>> Chuck Hill             
>> Executive Managing Partner, VP Development and Technical Services
>> 
>> Practical WebObjects - for developers who want to increase their overall 
>> knowledge of WebObjects or who are trying to solve specific problems.    
>> http://www.global-village.net/gvc/practical_webobjects
>> 
>> Global Village Consulting ranks 13th in 2012 in BIV's Top 100 Fastest 
>> Growing Companies in B.C! 
>> 
>> Global Village Consulting ranks 44th in 25th annual PROFIT 500 ranking of 
>> Canada’s Fastest-Growing Companies by PROFIT Magazine!
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
> 
> 
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
> Help/Unsubscribe/Update your Subscription:
> https://lists.apple.com/mailman/options/webobjects-dev/jeremy.deroyer%40ingencys.net
> 
> This email sent to jeremy.dero...@ingencys.net


 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to