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: Chuck Hill <email@hidden>
- Date: Mon, 21 Mar 2011 14:06:34 -0700
On Mar 19, 2011, at 1:28 AM, Giles Palmer wrote:
>>> 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.
The only way that I can think of is the result of unlocked access to the EC or DBC.
>>> 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?
The Wonder auto-locking is really intended for use within the Request-Response loop. I think it might work OK for threads if you have the correct properties set, but that manual locking is generally recommended for threads. And Wonder does not do anything for auto-locking of the DB context etc. (IIRC).
Chuck
>>> 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
>>
>>
>>
>>
>>
>>
>>
>
--
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
Attachment:
smime.p7s
Description: S/MIME cryptographic signature
_______________________________________________
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