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