Hi,
I keep finding this error with ode 1.3.5 running inside servicemix 3.3.2,
with mysql 5.1.54.
java.lang.IllegalArgumentException: No such channel; id=20
at
org.apache.ode.jacob.vpu.ExecutionQueueImpl.findChannelFrame(ExecutionQueueImpl.java:205)
at
org.apache.ode.jacob.vpu.ExecutionQueueImpl.consumeExport(ExecutionQueueImpl.java:232)
at
org.apache.ode.jacob.vpu.JacobVPU$JacobThreadImpl.importChannel(JacobVPU.java:369)
at org.apache.ode.jacob.JacobObject.importChannel(JacobObject.java:47)
at
org.apache.ode.bpel.engine.BpelRuntimeContextImpl$7.run(BpelRuntimeContextImpl.java:1094)
at sun.reflect.GeneratedMethodAccessor160.invoke(Unknown Source)
Inside the ODE_JOBS table I can find a row referencing the channel 20.
After some debugging I could reproduce, by chance, a situation with to
different jobs with the same channel id 20. Is this correct?
Then the first job completed correctly and the other remained stuck forever.
I traced the problema back to ExecutionQueueImpl, line: 124 where
_objIdCounter is used to assign the channel number.
>From the eclipse debugger stack trace, below, I see that no monitors are
held inside this method and, on first sight, looks like the _objIdCounter
variable is "not protected".
Is this intended?
If so, is the problem due to running multiple instances of SimpleScheduler
with a servicemix ThreadPoolExecutor?
Thread [pool-5-thread-1] (Suspended (breakpoint at line 124 in
ExecutionQueueImpl))
ExecutionQueueImpl.add(CommChannel) line: 124
JacobVPU$JacobThreadImpl.newChannel(Class, String, String) line: 350
PROCESS(JacobObject).newChannel(Class<T>, String) line: 74
PROCESS(JacobObject).newChannel(Class<T>) line: 63
PROCESS.run() line: 51
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not
available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 592
JacobVPU$JacobThreadImpl.run() line: 451
JacobVPU.execute() line: 139
BpelRuntimeContextImpl.execute() line: 968
PartnerLinkMyRoleImpl.invokeNewInstance(MyRoleMessageExchangeImpl,
PartnerLinkMyRoleImpl$RoutingInfo) line: 208
BpelProcess$1.invoke(PartnerLinkMyRoleImpl,
PartnerLinkMyRoleImpl$RoutingInfo, boolean) line: 283
BpelProcess.invokeProcess(MyRoleMessageExchangeImpl,
BpelProcess$InvokeHandler) line: 238
BpelProcess.invokeProcess(MyRoleMessageExchangeImpl) line: 279
BpelProcess.handleJobDetails(Scheduler$JobDetails) line: 426
BpelEngineImpl.onScheduledJob(Scheduler$JobInfo) line: 460
BpelServerImpl.onScheduledJob(Scheduler$JobInfo) line: 450
SimpleScheduler$RunJob$1.call() line: 518
SimpleScheduler$RunJob$1.call() line: 512
SimpleScheduler.execTransaction(Callable<T>, int) line: 284
SimpleScheduler.execTransaction(Callable<T>) line: 239
SimpleScheduler$RunJob.call() line: 512 [local variables unavailable]
SimpleScheduler$RunJob.call() line: 496 [local variables unavailable]
FutureTask$Sync.innerRun() line: 269
FutureTask<V>.run() line: 123
ThreadPoolExecutor$Worker.runTask(Runnable) line: 651
ThreadPoolExecutor$Worker.run() line: 676 [local variables
unavailable]
Thread.run() line: 595
Invoking the bpel process with multiple client threads fill up the ode_jobs
table with "broken" jobs and servicemix stops responding.
Thanks, for any suggestion.
Bye
Lorenzo