Hi Chuck / Kieran

Thank you very much for this.  I am now back on track.  I'll take a look at 
ERXTaskThreadPoolExecutor too.

Much appreciated

Giles

> 
> On Mar 19, 2011, at 4:28 AM, Giles Palmer wrote:
> 
>> Hi Chuck
>> 
>> Thanks, see below...
>> 
>> 
>>> 
>>> 
>>>> Hi
>>>> 
>>>> I have just had an exception thrown on some relatively recent code, that 
>>>> has worked fine until now..
>>>> 
>>>> java.lang.IllegalStateException:  Cannot obtain globalId for an object 
>>>> which is registered in its editingContext, 
>>>> object: <indoc.app.entities.Container pk:"496">, 
>>>> databaseContext: er.extensions.eof.ERXDatabaseContext@ee260b, 
>>>> object's editingContext: er.extensions.eof.ERXEC@1fe6055, 
>>>> databaseContext's active editingContext: null
>>> 
>>> That last part:
>>>> databaseContext's active editingContext: null
>>> 
>>> Indicates the problem.
>> 
>> Yeah, I just don't quite understand what "active editingContext" means to 
>> the databaseContext or how it can be null.
>> 
>>> 
>>> 
>>>> Context:
>>>> 
>>>> This is part of a background notification system which works roughly like:
>>>> 
>>>> 1) NSNotificationCenter triggers a callback that...
>>>> 
>>>> 2) Creates a new Runnable and globalIds of objects are passed into this 
>>>> runnable from their original editing context.  A ThreadPoolExecutor the 
>>>> executes the thread.
>>>> 
>>>> 3) The new thread creates a new editing context that uses an 
>>>> ERXRoundRobinCollection to grab an EOObjectStoreCoordinator.  This 
>>>> EOObjectStoreCoordinator is only used in the notification part of the 
>>>> application, and the ERXRoundRobinCollection contains just a couple of 
>>>> instances of a EOObjectStoreCoordinator at a time.
>>>> 
>>>> The ec is created with:
>>>> ERXEC notificationtEC = (ERXEC) 
>>>> ERXEC.newEditingContext(objectStoreCollection.nextObjectStoreCoordinator());
>>>> 
>>>> and the EOObjectStoreCoordinators with:
>>>> ERXObjectStoreCoordinator osc = new ERXObjectStoreCoordinator(true);
>>>> 
>>>> 
>>>> 4) I then use the newly created notificationtEC to convert the globalIds 
>>>> back to EOs like.. eo = 
>>>> ERXEOControlUtilities.convertGIDtoEO(notificationtEC, gid);
>>> 
>>> Are you locking the EC that you created?
>>> 
>> 
>> No I am not explicitly locking anything.  The app is a full blown Wonder app 
>> and I was under the impression that this relinquished me from having to 
>> worry about locking provided I was using ERXEC to create my editing contexts 
>> etc.  Is this not the case then?
>> 
> 
> You *should* lock in background threads.
> 
> ERXEC notificationtEC = (ERXEC) 
> ERXEC.newEditingContext(objectStoreCollection.nextObjectStoreCoordinator());
> notificationtEC.lock();
> try {
>       
>       // do stuff
> 
>       notificationtEC.saveChanges();
> } catch (Exception e) {
>       log.error("We had an unexpected error in background thread blah blah 
> blah....", e);
> } finally {
>       notificationtEC.unlock();
> }
> 
> 
> 
> However, if you want the ERXEC auto unlock safety net in your background 
> thread, you can do this:
> 
>       Runnable r = new MyNotificationsRunnableTask(NSArray<EOGlobal> gids);
> 
>       ERXExecutorService.executorService().execute( r );
> 
> ...... that will ensure that any leftover locked ERXEC's get automatically 
> unlocked after the Runnable has executed
> 
> BTW, to understand this @see 
> er.extensions.concurrency.ERXTaskThreadPoolExecutor.afterExecute(Runnable, 
> Throwable)
> and for javadoc @see 
> java.util.concurrent.ThreadPoolExecutor.afterExecute(Runnable, Throwable)
> 
> HTH, Kieran
> 
>> Regards
>> 
>> Giles
>> 
>>> 
>>>> 
>>>> 5) I then use the same notificationtEC to fetch various objects etc to 
>>>> build the notifications and send out an email.
>>>> 
>>>> The full stack trace is below.
>>>> 
>>>> I was under the impression that having a new database stack should be a 
>>>> pretty safe way to do such a task in a separate thread. Do you have any 
>>>> idea what I am doing wrong?
>>>> 
>>>> I do not quite understand the meaning of the above 
>>>> java.lang.IllegalStateException   Any ideas much appreciated.
>>>> 
>>>> Thanks
>>>> 
>>>> Giles
>>>> 
>>>> Mar 18 12:32:10 OLWAInDoc[2001] pool-3-thread-1 ERROR 
>>>> indoc.app.event.IDEventObserverCoordinator$ChannelRunnable  - Error in 
>>>> ChannelRunnable.run() Cannot obtain globalId for an object which is 
>>>> registered in its editingContext, object: <indoc.app.entities.Container 
>>>> pk:"496">, databaseContext: er.extensions.eof.ERXDatabaseContext@ee260b, 
>>>> object's editingContext: er.extensions.eof.ERXEC@1fe6055, 
>>>> databaseContext's active editingContext: null
>>>> java.lang.IllegalStateException: Cannot obtain globalId for an object 
>>>> which is registered in its editingContext, object: 
>>>> <indoc.app.entities.Container pk:"496">, databaseContext: 
>>>> er.extensions.eof.ERXDatabaseContext@ee260b, object's editingContext: 
>>>> er.extensions.eof.ERXEC@1fe6055, databaseContext's active editingContext: 
>>>> null
>>>>    at 
>>>> com.webobjects.eoaccess.EODatabaseContext._globalIDForObject(EODatabaseContext.java:4660)
>>>>    at 
>>>> com.webobjects.eoaccess.EODatabaseContext.valuesForKeys(EODatabaseContext.java:6509)
>>>>    at 
>>>> com.webobjects.eocontrol.EOObjectStoreCoordinator.valuesForKeys(EOObjectStoreCoordinator.java:326)
>>>>    at 
>>>> com.webobjects.eoaccess.EOQualifierSQLGeneration$_KeyValueQualifierSupport.schemaBasedQualifierWithRootEntity(EOQualifierSQLGeneration.java:439)
>>>>    at 
>>>> er.extensions.ERXExtensions$KeyValueQualifierSQLGenerationSupport.schemaBasedQualifierWithRootEntity(ERXExtensions.java:355)
>>>>    at 
>>>> com.webobjects.eoaccess.EOQualifierSQLGeneration$Support._schemaBasedQualifierWithRootEntity(EOQualifierSQLGeneration.java:179)
>>>>    at 
>>>> com.webobjects.eoaccess.EOQualifierSQLGeneration$_AndQualifierSupport.schemaBasedQualifierWithRootEntity(EOQualifierSQLGeneration.java:530)
>>>>    at 
>>>> com.webobjects.eoaccess.EOQualifierSQLGeneration$Support._schemaBasedQualifierWithRootEntity(EOQualifierSQLGeneration.java:179)
>>>>    at 
>>>> com.webobjects.eoaccess.EOQualifierSQLGeneration$_AndQualifierSupport.schemaBasedQualifierWithRootEntity(EOQualifierSQLGeneration.java:530)
>>>>    at 
>>>> com.webobjects.eoaccess.EOQualifierSQLGeneration$Support._schemaBasedQualifierWithRootEntity(EOQualifierSQLGeneration.java:179)
>>>>    at 
>>>> com.webobjects.eoaccess.EOQualifierSQLGeneration$_OrQualifierSupport.schemaBasedQualifierWithRootEntity(EOQualifierSQLGeneration.java:567)
>>>>    at 
>>>> com.webobjects.eoaccess.EOQualifierSQLGeneration$Support._schemaBasedQualifierWithRootEntity(EOQualifierSQLGeneration.java:179)
>>>>    at 
>>>> com.webobjects.eoaccess.EODatabaseChannel.selectObjectsWithFetchSpecification(EODatabaseChannel.java:227)
>>>>    at 
>>>> com.webobjects.eoaccess.EODatabaseContext._objectsWithFetchSpecificationEditingContext(EODatabaseContext.java:3055)
>>>>    at 
>>>> er.extensions.eof.ERXDatabaseContext._objectsWithFetchSpecificationEditingContext(ERXDatabaseContext.java:66)
>>>>    at 
>>>> com.webobjects.eoaccess.EODatabaseContext.objectsWithFetchSpecification(EODatabaseContext.java:3195)
>>>>    at 
>>>> com.webobjects.eocontrol.EOObjectStoreCoordinator.objectsWithFetchSpecification(EOObjectStoreCoordinator.java:488)
>>>>    at 
>>>> com.webobjects.eocontrol.EOEditingContext.objectsWithFetchSpecification(EOEditingContext.java:4069)
>>>>    at 
>>>> er.extensions.eof.ERXEC.objectsWithFetchSpecification(ERXEC.java:1206)
>>>>    at 
>>>> com.webobjects.eocontrol.EOEditingContext.objectsWithFetchSpecification(EOEditingContext.java:4444)
>>>>    at 
>>>> indoc.app.entities._IDEventRegistration.fetchIDEventRegistrations(_IDEventRegistration.java:351)
>>>>    at 
>>>> indoc.app.event.IDEventObserverCoordinator$ChannelRunnable.processEventRegistrations(IDEventObserverCoordinator.java:238)
>>>>    at 
>>>> indoc.app.event.IDEventObserverCoordinator$ChannelRunnable.run(IDEventObserverCoordinator.java:143)
>>>>    at 
>>>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>>>>    at 
>>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>>>>    at java.lang.Thread.run(Thread.java:619)
>>>> 
>>>> _______________________________________________
>>>> Do not post admin requests to the list. They will be ignored.
>>>> Webobjects-dev mailing list      ([email protected])
>>>> Help/Unsubscribe/Update your Subscription:
>>>> http://lists.apple.com/mailman/options/webobjects-dev/chill%40global-village.net
>>>> 
>>>> This email sent to [email protected]
>>> 
>>> -- 
>>> Chuck Hill             Senior Consultant / VP Development
>>> 
>>> 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/products/practical_webobjects
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>> 
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Webobjects-dev mailing list      ([email protected])
>> Help/Unsubscribe/Update your Subscription:
>> http://lists.apple.com/mailman/options/webobjects-dev/kelleherk%40gmail.com
>> 
>> This email sent to [email protected]
> 

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

This email sent to [email protected]

Reply via email to