【问题标题】:Activiti: When a CallActivity fails, the Workflow never endsActiviti:当一个 CallActivity 失败时,Workflow 永远不会结束
【发布时间】:2016-01-26 05:57:55
【问题描述】:

我遇到了异步工作流的问题。 我有这个设计:

工作流程1:

start -> ScriptActivity1 (正在抛出 NullPointerException 来测试错误处理)-> end

工作流程2:

start -> CallActivity (调用workflow1 -> end


我看到如果我将工作流部署为异步,如果 workflow1 失败,workflow2 永远不会结束,但是在部署它们时不会发生这种情况同步。

另外,如果我只执行 workflow1,它会无法正确显示相应的异常。

有谁知道如何处理这个问题?

【问题讨论】:

  • 您在某处处理 NPE 吗?如果不是,这是您有异步任务时的预期行为。当 Activiti 从一个活动中得到一个技术异常(任何不是 BpmnError 的子类)时,它会重试几次。达到重试限制后,引擎放弃,但相应的作业保留在控制表中 - 至少对于“经典”作业执行器而言。假设是生产中的技术错误通常是由临时问题引起的,例如外部服务不可用。您可以使用 API 或数据库更新重新启动失败的作业。

标签: activiti bpmn


【解决方案1】:

这一切都与线程模型的工作方式有关。 我想你的“测试”过程没有人工任务,这就是为什么你正在经历你的行为。 同步进程与发起者在同一线程上运行,直到它们达到等待状态(通常是消息侦听器、人工任务或信号侦听器)。因此,当您的工作流 1 进程失败时,它将终止工作流2。

当事情是异步的时,作业计划是启动您调用的进程的原因,它本质上是一个独立的进程(尽管确实有对其父进程的引用)。当工作流 1 失败时,工作流 2 会继续愉快地进行。

通常,您通过使用由异常路径上的信号抛出事件触发的信号捕获边界侦听器来模拟您正在经历的行为。

如果您需要图解示例,请告诉我。

【讨论】:

  • 非常感谢!.. 我在 Activiti 文档中阅读了有关边界侦听器的内容,但对我来说并不清楚.. 我非常感谢您提供了一个很好的图表,我可以在其中看到概念。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2013-04-09
  • 2010-12-27
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多