据我了解jbpm的单线程执行模型,当我调用jbpm更改某些内容时,在执行某些任务时调用不会返回。另一方面,用户指南6.2说(图24.1及以下),在某些情况下,jbpm控制台显示正在运行的服务任务并允许取消它们。这怎么可能?任务在某个事务中启动,不应对其他事务可见;否则,如果执行任务的事务回滚,我们就可以观察到幻像。而且,由于调用在有工作要做时没有返回,因此事务不会提交,因此其他人不应该看到任务执行的事实。我的推理出了什么问题?
答案 0 :(得分:0)
好的,现在我知道发生了什么。用户指南提示,但他们的措辞“引擎将等待completeWorkItem(...)方法返回,然后继续执行。”让我误认为completeWorkitem for executeWorkitem。毕竟,completeWorkitem不会返回到jBpm(它不是由jBpm调用的)! ExecuteWorkitem可以。所以jBpm不能等待“从completeWorkitem返回”,它只能等待对它的调用。换句话说,“在继续执行之前”并不意味着线程阻塞调用:调用返回但是jBPM进程将不会执行其他节点,直到有人调用completeWorkitem()。
所以,实际上它非常简单。假设我对jBpm进行了一些调用,这使得它执行进程并进入服务任务节点。在节点输入时,jBpm运行executeWorkitem,当然我的调用代码在executeWorkitem完成之前无法获得控制权。如果它正在执行一些重的,好的,太糟糕的事情,并且这个事务在这个重要的事情结束之前不会发生,所以没有人能在半空中看到它。但是如果它立即返回(在调用completeWorkitem之后,或者在启动稍后将调用它的线程之后),jBpm将再次查看是否有一些节点准备好进入。如果没有这样的节点(如果还没有调用completeWorkitem),进程进入等待状态并且执行返回到调用者,所以现在如果调用者提交(或者如果jBpm没有加入任何事务但是自己开始),那么每个人都有将能够看到服务任务已启动但尚未完成。