Re: Cannot obtain globalId for an object failure
Re: Cannot obtain globalId for an object failure
- Subject: Re: Cannot obtain globalId for an object failure
- From: Giles Palmer <email@hidden>
- Date: Tue, 22 Mar 2011 14:02:35 +0000
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@hidden)
>>>> Help/Unsubscribe/Update your Subscription:
>>>>
>>>> This email sent to email@hidden
>>>
>>> --
>>> 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@hidden)
>> Help/Unsubscribe/Update your Subscription:
>>
>> This email sent to email@hidden
>
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden