服务任务在执行过程中是否可见?
Service tasks visible in the middle of execution?
据我了解 jbpm 的单线程执行模型,当我调用 jbpm 更改某些内容时,调用不会 return 虽然有一些任务要执行。另一方面,用户指南 6.2 说(图 24.1 及以下)在某些情况下 jbpm 控制台显示 运行 服务任务并允许取消它们。这怎么可能?任务在某个事务中启动,不应该对其他事务可见;否则,如果执行任务的事务回滚,我们可能会观察到幻影。并且,由于在有工作要做时调用不会 return,事务不会提交,因此任务执行的事实不应该被其他人看到。我的推理有什么问题?
好的,现在我知道是怎么回事了。用户指南对此有提示,但他们的措辞 "The engine will wait for the completeWorkItem(...) method to return before continuing execution." 让我将 completeWorkitem 误认为是 executeWorkitem。毕竟,completeWorkitem 不会 return 到 jBpm(它不是由 jBpm 调用的)! ExecuteWorkitem 确实如此。所以 jBpm 不能等待 "return from completeWorkitem",它只能等待对它的调用。换句话说,"before continuing execution" 并不意味着线程阻塞调用:调用 returns 但 jBPM 进程不会执行其他节点,直到有人调用 completeWorkitem()。
所以,其实很简单。假设我对 jBpm 进行了一些调用,使其执行流程并进入服务任务节点。在节点进入时,jBpm 运行 executeWorkitem,当然我的调用代码在 executeWorkitem 完成之前不会获得控制权。如果它正在执行一些繁重的事情,那就太糟糕了,在这件沉重的事情完成之前,这个交易不会提交,所以没有人能在半空中看到它。但是如果它立即 returning(在调用 completeWorkitem 之后,或者在启动一个稍后将调用它的线程之后),jBpm 将再次查看是否有一些节点准备好进入。如果没有这样的节点(如果 completeWorkitem 还没有被调用),进程进入等待状态并执行 returns 给调用者,所以现在如果调用者提交(或者如果 jBpm 没有加入任何事务但是开始了它自己的),每个人都将能够看到服务任务已启动但尚未完成。
据我了解 jbpm 的单线程执行模型,当我调用 jbpm 更改某些内容时,调用不会 return 虽然有一些任务要执行。另一方面,用户指南 6.2 说(图 24.1 及以下)在某些情况下 jbpm 控制台显示 运行 服务任务并允许取消它们。这怎么可能?任务在某个事务中启动,不应该对其他事务可见;否则,如果执行任务的事务回滚,我们可能会观察到幻影。并且,由于在有工作要做时调用不会 return,事务不会提交,因此任务执行的事实不应该被其他人看到。我的推理有什么问题?
好的,现在我知道是怎么回事了。用户指南对此有提示,但他们的措辞 "The engine will wait for the completeWorkItem(...) method to return before continuing execution." 让我将 completeWorkitem 误认为是 executeWorkitem。毕竟,completeWorkitem 不会 return 到 jBpm(它不是由 jBpm 调用的)! ExecuteWorkitem 确实如此。所以 jBpm 不能等待 "return from completeWorkitem",它只能等待对它的调用。换句话说,"before continuing execution" 并不意味着线程阻塞调用:调用 returns 但 jBPM 进程不会执行其他节点,直到有人调用 completeWorkitem()。
所以,其实很简单。假设我对 jBpm 进行了一些调用,使其执行流程并进入服务任务节点。在节点进入时,jBpm 运行 executeWorkitem,当然我的调用代码在 executeWorkitem 完成之前不会获得控制权。如果它正在执行一些繁重的事情,那就太糟糕了,在这件沉重的事情完成之前,这个交易不会提交,所以没有人能在半空中看到它。但是如果它立即 returning(在调用 completeWorkitem 之后,或者在启动一个稍后将调用它的线程之后),jBpm 将再次查看是否有一些节点准备好进入。如果没有这样的节点(如果 completeWorkitem 还没有被调用),进程进入等待状态并执行 returns 给调用者,所以现在如果调用者提交(或者如果 jBpm 没有加入任何事务但是开始了它自己的),每个人都将能够看到服务任务已启动但尚未完成。