BPMN 2.0 构造 (三)

这是我参与更文挑战的第13天,活动详情查看: 更文挑战

自定义扩展

BPMN 2.0 标准对所有相关方来说都是一件好事。最终用户不会因依赖专有解决方案而受到供应商锁定的影响。框架,尤其是像 Activiti 这样的开源框架,可以实现一个解决方案,该解决方案与大供应商的解决方案具有相同(并且通常实现得更好;-)的特性。由于 BPMN 2.0 标准,从如此大的供应商解决方案到 Activiti 的过渡是一条简单而平稳的道路。

然而,标准的不利之处在于,它始终是不同公司(通常是愿景)之间多次讨论和妥协的结果。作为阅读流程定义的 BPMN 2.0 XML 的开发人员,有时会觉得某些构造或做事方式太麻烦。由于 Activiti 将易于开发作为重中之重,我们引入了称为Activiti BPMN 扩展的东西。这些扩展是新的构造或简化某些未在 BPMN 2.0 规范中的构造的方法。

尽管 BPMN 2.0 规范明确指出它是为自定义扩展而制作的,但我们确保:

这种自定义扩展的先决条件是始终必须对标准的做事方式进行简单的转换。因此,当您决定使用自定义扩展时,您不必担心没有退路。

使用自定义扩展时,总是通过为新的 XML 元素、属性等提供activiti:命名空间前缀来明确指示。

因此,是否要使用自定义扩展完全取决于您。有几个因素会影响这个决定(图形编辑器的使用、公司政策等)。我们只提供它们,因为我们相信标准中的某些点可以更简单或更有效地完成。随时就我们的扩展向我们提供(正面和/或负面)反馈,或发布自定义扩展的新想法。谁知道呢,总有一天你的想法可能会出现在规范中!

活动

事件用于对生命周期过程中发生的事情进行建模。事件总是可视化为一个圆圈。在 BPMN 2.0 中,有两个主要的事件类别:捕获或抛出事件。

捕获:当流程执行到达事件时,它将等待触发发生。触发器的类型由内部图标或 XML 中的类型声明定义。通过未填充的内部图标(即白色),捕捉事件与投掷事件在视觉上有所区别。

抛出:当流程执行到达事件时,触发触发器。触发器的类型由内部图标或 XML 中的类型声明定义。投掷事件通过填充黑色的内部图标在视觉上与捕获事件区分开来。

事件定义

事件定义定义了事件的语义。没有事件定义,事件“没有什么特别之处”。例如,没有和事件定义的开始事件没有指定具体是什么开始过程。如果我们将事件定义添加到开始事件(例如定时器事件定义),我们声明什么“类型”的事件启动进程(在定时器事件定义的情况下,到达某个时间点的事实) .

定时器事件定义

定时器事件是由定义的定时器触发的事件。它们可以用作开始事件、中间事件或边界事件。时间事件的行为取决于所使用的业务日历。每个计时器事件都有一个默认的业务日历,但也可以在计时器事件定义上定义业务日历。

<timerEventDefinition activiti:businessCalendarName="custom">
    ...
</timerEventDefinition>
复制代码

其中 businessCalendarName 指向流程引擎配置中的业务日历。当省略业务日历时,将使用默认业务日历。

计时器定义必须仅包含以下元素之一:

时间日期。此格式以ISO 8601格式指定固定日期,何时触发触发器。例子:

<timerEventDefinition>
    <timeDate>2011-03-11T12:13:14</timeDate>
</timerEventDefinition>
复制代码

时间持续时间。要指定计时器在触发之前应该运行多长时间,可以将timeDuration指定为timerEventDefinition 的子元素。使用的格式是ISO 8601格式(根据 BPMN 2.0 规范的要求)。示例(间隔持续 10 天):

<timerEventDefinition>
    <timeDuration>P10D</timeDuration>
</timerEventDefinition>

复制代码

时间周期。指定重复间隔,这对于定期启动进程或为过期的用户任务发送多个提醒很有用。时间周期元素可以有两种格式。首先是ISO 8601标准规定的循环持续时间格式。示例(3 个重复间隔,每个持续 10 小时):

还有指定的可能性结束日期为对可选属性timeCycle或无论是在如下的时间表达式的结尾:R3/PT10H/EndDate。当到达结束日期时,应用程序将停止为此任务创建其他作业。它接受静态值ISO8601标准(例如“20150225T16:42:11+00:00”)或变量{EndDate}。当到达结束日期时,应用程序将停止为此任务创建其他作业。它接受静态值ISO 8601标准(例如“2015-02-25T16:42:11+00:00”)或变量{EndDate} 作为值

<timerEventDefinition>
    <timeCycle activiti:endDate="2015-02-25T16:42:11+00:00">R3/PT10H</timeCycle>
</timerEventDefinition>
复制代码
<timerEventDefinition>
    <timeCycle>R3/PT10H/${EndDate}</timeCycle>
</timerEventDefinition>
复制代码

如果两者都被指定,则系统将使用指定为属性的结束日期。

目前只有BoundaryTimerEvents和CatchTimerEvent支持EndDate功能。

此外,您可以使用 cron 表达式指定时间周期,下面的示例显示触发器每 5 分钟触发一次,从整小时开始:

0 0/5 * * * ?
复制代码

请参阅本教程以使用 cron 表达式。

注意:第一个符号表示秒,而不是普通 Unix cron 中的分钟。

循环持续时间更适合处理相对计时器,这些计时器是针对某个特定时间点(例如用户任务开始的时间)计算的,而 cron 表达式可以处理绝对计时器 – 这对于计时器启动事件特别有用。

您可以使用计时器事件定义的表达式,这样您就可以根据流程变量影响计时器定义。过程变量必须包含适用于适当计时器类型的 ISO 8601(或循环类型的 cron)字符串。

<boundaryEvent id="escalationTimer" cancelActivity="true" attachedToRef="firstLineSupport">
  <timerEventDefinition>
    <timeDuration>${duration}</timeDuration>
  </timerEventDefinition>
</boundaryEvent>
复制代码

注:当启用该作业或异步执行的定时器,仅启动(即jobExecutorActivate或asyncExecutorActivate需要被设置为true在activiti.cfg.xml,因为工作和异步执行默认情况下禁用)。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享