Hi,
I have been debugging some strange errors in our web app that seems to
be related to context and threads, let me explain, we are using Cayenne
3.0.1 using WebApplicationContextFilter to bind the context to threads,
in some parts of the application is not so difficult to be processing
several AJAX request from the same user, and they go to different
threads but using the same context (because of the context per session
setup) and this causes race condition errors from time to time.
To avoid that I have switched to use nested context per request, this
allows us to use the filter as ever but avoid messing contexts in
different threads at the same time, but this only works with single
requests, when I get 5 o 6 threads working at the same time they just
reach to a deadlock state every time I try.
Every thread stops at:
Daemon Thread [http-8443-2] (Suspended)
DispatchQueue.dispatchEvent(EventManager$Dispatch) line: 53
EventManager.dispatchEvent(EventManager$Dispatch) line: 359
EventManager.postEvent(EventObject, EventSubject) line: 330
DataContext(BaseContext).fireDataChannelChanged(Object, GraphDiff)
line: 349
DataContext.fireDataChannelChanged(Object, GraphDiff) line: 1591
DataContext.onContextFlush(ObjectContext, GraphDiff, boolean) line:
1060
DataContext(BaseContext).onSync(ObjectContext, GraphDiff, int)
line: 300
DataContext.flushToParent(boolean) line: 1106
DataContext.commitChanges() line: 1045
Except one that stops at:
Daemon Thread [http-8443-3] (Suspended)
DataContextMergeHandler.graphChanged(GraphEvent) line: 103
GeneratedMethodAccessor88.invoke(Object, Object[]) line: not available
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
Invocation.fire(Object[]) line: 202
EventManager$Dispatch.fire(Invocation) line: 420
DispatchQueue.dispatchEvent(Collection<Invocation>, Dispatch) line:
156
DispatchQueue.dispatchEvent(EventManager$Dispatch) line: 57
EventManager.dispatchEvent(EventManager$Dispatch) line: 359
EventManager.postEvent(EventObject, EventSubject) line: 330
DataContext(BaseContext).fireDataChannelChanged(Object, GraphDiff)
line: 349
DataContext.fireDataChannelChanged(Object, GraphDiff) line: 1591
DataContext.onContextFlush(ObjectContext, GraphDiff, boolean) line:
1060
DataContext(BaseContext).onSync(ObjectContext, GraphDiff, int)
line: 300
DataContext.flushToParent(boolean) line: 1106
DataContext.commitChanges() line: 1045
Maybe someone can help me with this deadlock or at least point me to a
different setup to bypass the thread safety errors I am having from time
to time.
Thanks in advance.
Ramiro Aparicio