说说 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 类定义的可扩展对象,都会在流程定义解析期间被初始化。
因此,这些可扩展的对象不能保存具有状态的、可以 “动态” 改变的数据。
我们可以在流程定义中,静态地为成员域指定需要的值,形如下图中所示的那样:
如果确实需要注入动态数据,可以在定义中引用流程变量(EL 表达式)。