Activiti权威指南
上QQ阅读APP看书,第一时间看更新

5.3 自定义元素实战

先思考如下几个问题。

(1)如何自定义元素?在哪里定义?

(2)自定义元素的名称以及命名空间前缀如何定义?

(3)自定义元素添加到父级元素之后如何进行获取?

在使用Activiti的时候,开发人员有时为了满足自己的业务需求,需要对流程文档中的userTask元素进行扩展,例如期望可以在任务节点中配置该任务的处理人,节点跳转操作等附属属性,如果该节点可以进行跳转操作,则需要配置可以跳转的节点集合、范围等一些信息,这样任务节点解析时就可以将扩展的属性解析出来,并将其注入流程虚拟机中,从而保证流程运转时可以获取到自定义的扩展信息。下面定义一个流程文档,该流程文档的内容如代码清单5-3所示。

代码清单5-3 ShareniuExtensionElement.bpmn20.xml

在上述代码中,第4行定义了名称为xmlns:shareniu的命名空间,尽管这个命名空间看起来像一个URL,但这并不意味着在流程文档中声明和使用命名空间的时候一定要连接到互联网,实际上命名空间仅仅是一个概念而已,可以定义为任意值,因此在浏览器中输入命名空间的URL并不要期望它会输出该命名空间下的所有元素和属性信息。

约定

本书中如果没有特殊说明,xmlns:shareniu的值均为http://www.shareniu.com

第12~18行中为id为operationTask的任务节点添加了自定义元素,为了保证流程文档中自定义元素可以被引擎正常地解析使用,这里使用了shareniu命名空间作为自定义元素的前缀,形如<shareniu:shareniuOperations>,这样操作是为了方便Activiti识别自定义元素,当然也可以使用definitions元素中定义的任何一个命名空间作为扩展元素的前缀,例如<activiti:shareniuOperations>。

第13行明确告诉流程引擎<shareniu:shareniuOperations>是扩展元素(元素的名称不固定可以是任意值,千万不要以该案例定义的元素名称固化自己的思维),第14行定义了当前任务节点可以委托给哪一个用户进行处理,第15行定义了当前任务节点可以跳转到哪一个节点,第16行定义了一个文本标签,文本内容默认为shareniu。流程文档定义完毕,接下来讲解如何获取扩展元素中的属性值,4.4节讲解了流程文档解析完毕后所有的元素对象均存储在流程模型BpmnModel实例对象中,如果能够获取该实例对象,就可以通过该实例对象获取id为operationTask任务节点的所有信息,接下来自定义一个类用于获取扩展元素的属性值,该类的相关定义如代码清单5-4所示。

代码清单5-4 App.java

在上述代码中,第3~6行读取代码清单5-3定义的流程文档数据流,第10~11行开始获取BpmnModel实例对象,第13~14行获取id为operationTask任务节点的所有信息,第16~17行获取该任务节点的所有自定义元素。

执行上述代码后,控制台打印的信息如下:

        rookey=shareniuOperations
        childKey=transfer
        transferTo, shareniu
        childKey=goback
        backTo, startevent1
        childKey=text