说说 jBPM 流程定义语言(13)—— 可扩展接口(User Code)

我们可以根据实际的业务逻辑去实现这些可扩展的接口,然后在 jPDL 中引用这些实现。

目前支持这些扩展点:

  • custom:自定义活动(实现 ExternalActivityBehavior 接口)
  • event-listener:事件监听器(实现 EventListener 接口)
  • task 中的 assignment-handler:自定义任务分配处理器,实现 AssignmentHandle 接口。
  • decision 中的 handler:自定义判断处理逻辑,实现 DecisionHandler 接口。

1 通用属性和元素

通用属性:

属性 类型 默认值 是否必需 描述
class 全类名 class/expr (二选一) 引入的是全类名。对于每一个流程定义只会初始化一次,即调用构造方法。初始化生成的对象会被作为流程定义的一部分在执行环境中被缓存。
expr 表达式 class/expr (二选一) 表达式的值会被作为对象返回。 表达式会在每次使用时被计算执行。换句话说, 执行的结果值不会被缓存。

通用元素:

元素 数目 描述
field 0..* Java 成员域的值,在用户类对象被使用之前,注入到成员域中。
property 0..* 指定名称的 Java 值,在用户类被使用之前,通过相应的 setter 方法注入相应的值 。

上述 field 和 property 元素的属性:

属性 类型 默认值 是否必需 描述
name 字符串 必需 field 对应的成员域名称或 property 对应的 setter 方法的名称 。

field 和 property 元素可以通过设置以下的子元素来表示要被注入的值:

元素 数目 描述
string 0..1 java.lang.String 对象
int 0..1 java.lang.Integer 对象
long 0..1 java.lang.Long 对象
float 0..1 java.lang.Float 对象
double 0..1 java.lang.Double 对象
true 0..1 Boolean.TRUE 对象
false 0..1 Boolean.FALSE 对象
object 0..1 可以通过类反射初始化的对象

上述的基本类型为 string、 int、 long、 float、 double,它们都拥有以下属性,用于指定具体的值。

属性 类型 默认值 是否必需 描述
value 文本 必需 值会被强制转换为对应的 Java 对象,所以在定义时要注意匹配类型。

2 加载类

之前说过,流程定义被部署时,会被持久化到数据库中,同样,我们定义的扩展点也会以 Java Class 文件的形式被持久化到数据库中。

当发起一个流程实例时,就会缓存相应的流程实例,默认情况下,所有定义的扩展点也会作为流程定义的一部分被缓存。这样,所有通过 Java 类定义的可扩展对象,都会在流程定义解析期间被初始化。

因此,这些可扩展的对象不能保存具有状态的、可以 “动态” 改变的数据。

我们可以在流程定义中,静态地为成员域指定需要的值,形如下图中所示的那样:

说说 jBPM 流程定义语言(13)—— 可扩展接口(User Code)

如果确实需要注入动态数据,可以在定义中引用流程变量(EL 表达式)。