我有多个BPEL流程在WSO2(版本2.0.1)上运行良好。但过了一段时间后,日志中出现以下异常。我不知道他们的意思,也不知道如何摆脱它们。
以下是stacktrace的片段:
[2011-10-05 11:28:26,541] ERROR - Method "run" in class "org.apache.ode.bpel.rtrep.v2.RuntimeInstanceImpl$3" threw an unexpected exception. {org.apache.ode.jacob.vpu.JacobVPU}
java.lang.IllegalArgumentException: No such channel; id=71
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.rtrep.v2.RuntimeInstanceImpl$3.run(RuntimeInstanceImpl.java:627)
at sun.reflect.GeneratedMethodAccessor41.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.ode.jacob.vpu.JacobVPU$JacobThreadImpl.run(JacobVPU.java:451)
at org.apache.ode.jacob.vpu.JacobVPU.execute(JacobVPU.java:139)
at org.apache.ode.bpel.rtrep.v2.RuntimeInstanceImpl.execute(RuntimeInstanceImpl.java:639)
at org.apache.ode.bpel.engine.BpelRuntimeContextImpl.execute(BpelRuntimeContextImpl.java:618)
at org.apache.ode.bpel.engine.ODEProcess.executeContinueInstanceTimerReceived(ODEProcess.java:476)
at org.apache.ode.bpel.engine.ODEProcess.execInstanceEvent(ODEProcess.java:684)
at org.apache.ode.bpel.engine.ODEProcess.access$000(ODEProcess.java:105)
at org.apache.ode.bpel.engine.ODEProcess$4.run(ODEProcess.java:619)
at org.apache.ode.bpel.engine.Contexts$1.call(Contexts.java:86)
at org.apache.ode.bpel.engine.Contexts$1.call(Contexts.java:85)
at org.apache.ode.bpel.engine.Contexts.execTransaction(Contexts.java:106)
at org.apache.ode.bpel.engine.Contexts.execTransaction(Contexts.java:83)
at org.apache.ode.bpel.engine.BpelServerImpl$TransactedRunnable.run(BpelServerImpl.java:893)
at org.apache.ode.bpel.engine.BpelInstanceWorker$2.call(BpelInstanceWorker.java:143)
at org.apache.ode.bpel.engine.BpelInstanceWorker$2.call(BpelInstanceWorker.java:142)
at org.apache.ode.bpel.engine.BpelInstanceWorker.doInstanceWork(BpelInstanceWorker.java:174)
at org.apache.ode.bpel.engine.BpelInstanceWorker.run(BpelInstanceWorker.java:141)
at org.apache.ode.bpel.engine.ODEProcess$ProcessRunnable.run(ODEProcess.java:1290)
at org.apache.ode.bpel.engine.BpelServerImpl$ServerRunnable.run(BpelServerImpl.java:839)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
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)
这是来自其中一个例外的完整堆栈跟踪。这些错误似乎对实际运行的进程没有影响,因为所有的都做了应该做的事情。这可能是我的WSO2 / ODE实例的配置问题吗?也许这是一个线程池问题?!
任何帮助或暗示都会很棒,谢谢!
答案 0 :(得分:1)
从日志中,这不是配置问题,而是内部错误。出于某种原因,导航器接收到一个计时器事件(您使用<pick>
和{或1}和/或事件处理程序吗?)但此计时器的回调通道不再存在(不再)。我可以想象这样的计时器已经安排好但在流程实例完成时没有删除。稍后,当触发计时器时,目标活动的路径不可用。这只是猜测工作,但适合您的描述。我只知道ODE和ODE 2.0实验代码库,而不是WSO2的自定义代码,所以我建议在他们的JIRA中提交一个bug。
答案 1 :(得分:1)
我们能够确定导致java.lang.IllegalArgumentException的一个问题:没有这样的频道;您可以从以下jira中找到。 https://wso2.org/jira/browse/BPS-218
这些将被纳入新版本。
答案 2 :(得分:0)
解决方法可能是使用Timer而不是onAlarm。移除onAlarm
并将计时器活动与选择活动并行放置。将pick和timer活动包装到Scope中,并为其附加异常处理程序。在异常处理程序中没有任何关系,它只是使引擎取消范围内的所有活动,包括计时器(unfortunatley,onAlarm
未被取消)。
每当你想取消计时器时,都会抛出异常,并且在计时器的活动路径中,以使 bpel 引擎退出(并行)选择活动。
可能发生的问题:计时器(即前onAlarm
)可能会在引擎未在pick-activity
中等待时触发,但在异常触发前执行常规onMessage
...