bpm基本组件讲解
1.BPM根节点
1.1 xml代码
<bpm code="bpm.testStudy" name="testStudy" type="process" description="This is test demo."></bpm>
1.2 字段说明
属性code:该属性最重要,当引擎start执行流程时,会要求传入code参数,这个参数就是流程文件中的code字段.code约定用点表示文件存放目录层级.如上bpm.ktvExample表示文件在resources下的bpm文件夹下,名字叫ktvExample.
属性type:目前固定写死process,后续可扩展支持多种类型流程.
属性name:按自己工程需要命名.
属性description:按自己工程需要命名.
引擎执行流程代码片段:
Map result = ProcessEngineFactory.getProcessEngine().start(code, context);
2.全局变量
2.1 xml代码
<var name="locationId" description="门店编号" dataType="java.lang.Integer" inOutType="param">
<var name="longitude" description="经度" dataType="java.lang.Double" inOutType="param">
<var name="latitude" description="纬度" dataType="java.lang.Double" inOutType="param">
<var name="checkResult" description="校验结果" dataType="java.lang.Boolean" inOutType="return">
2.2 字段说明
参数用var节点表示,直接在根节点bpm下的就叫全局参.
inOutType属性: 表示参数类型,值有3种: param、inner、return.
1. param: 表示对应引擎start的入参.当我们start流程时,除了需要设置code,还需要设置contex.他是一个MAP,其中key就需要映射成上面var节点的name属性.
2.inner: 表示内部运行时各个节点执行后的中间变量.
3.return: 表示返回结果变量.流程执行完成后,我们拿到了一个result结果.是个MAP.其中指定了return类型的var节点,我们可以通过name作为key从result拿到值.
dataType属性:参数类型,支持java类型写法例如上面的: java.lang.Integer.
name属性:变量名称
description属性:变量描述
3.开始节点: start
3.1 xml代码
<start id="1" name="开始" tag="223" g="105,17,30,30">
3.2 字段说明
流程的开始节点用start表示.
transition属性:表示指向下一个节点.
to:就是下一个节点的id.
id属性:节点的唯一标志,请保持唯一
tag属性:节点的附加数据
name属性:节点名称会在流程图上显示
g属性:布局
4.结束节点: end
4.1 xml代码
<end id="11" name="结束" tag="已经结束" g="101,549,30,30">
4.2 字段说明
id属性:节点的唯一标志,请保持唯一
tag属性:节点的附加数据
name属性:节点名称会在流程图上显示
g属性:布局
5.自动节点: autoTask--流程节点
5.1 xml代码
<autoTask id="12" name="返回验证结果" g="72,269,88,48">
<var name="locationId" description="门店编号" dataType="java.lang.Integer" contextVarName="locationId" inOutType="param">
<var name="longitude" description="经度" dataType="java.lang.Double" contextVarName="longitude" inOutType="param">
<var name="latitude" description="纬度" dataType="java.lang.Double" contextVarName="latitude" inOutType="param">
<var name="checkResult" description="校验结果" dataType="java.lang.Boolean" contextVarName="checkResult" inOutType="return">
5.2 字段说明
自动节点用autoTask表示是最常见的.他主要执行一段逻辑.目前支持springBean的配置和普通javaBean的配置.其中action就是要配置的动作.下面actionHandle配置该动作出入参.最终这个节点会被编译成javaCode如下:
//AutoTaskNode: 返回验证结果((MockSpringBean)BeanProvider.getBean("mockSpringBean")).checkLocation(locationId,longitude,latitude);
6.判断节点: decision
6.1 xml代码
<decision id="8" name="验证地址信息" g="72,109,88,48"> <transition to="9" priority="1" name="离得近" g=":-15,20">
<transition to="10" priority="2" name="离得远" expression="locationId>=5" g=":-15,20">
<var name="locationId" description="门店编号" dataType="java.lang.Integer" contextVarName="locationId" inOutType="param">
<var name="longitude" description="经度" dataType="java.lang.Double" contextVarName="longitude" inOutType="param">
<var name="latitude" description="纬度" dataType="java.lang.Double" contextVarName="latitude" inOutType="param">
<var name="checkResult" description="校验结果" dataType="java.lang.Boolean" contextVarName="checkResult" inOutType="return">
6.2 字段说明
判断节点用decision表示.他主要执行一段逻辑.然后根据执行后的逻辑值进行表达式判断后,再走不同的分支.例如上面会先执行com.alibaba.compileflow.demo.mock.MockLocations的checkLocation方法.checkLocation方法会返回checkResult变量.其中他的上下文名称是checkResult.执行完成后,引擎会根据transition的expression表达式.进行逻辑选择,例如该节点会编译成javaCode:
public Map execute(Map _pContext) throws Exception {
locationId = (Integer)DataType.transfer(_pContext.get("locationId"), Integer.class);
longitude = (Double)DataType.transfer(_pContext.get("longitude"), Double.class);
latitude = (Double)DataType.transfer(_pContext.get("latitude"),
Double.class);Map _pResult = new HashMap<>();
//DecisionNode: 验证地址信息mockLocationsCheckLocation();
if (locationId>=5) { //离得远{ //ScriptTaskNode: 失败((MockLocations)ObjectFactory.getInstance("com.alibaba.compileflow.demo.mock.MockLocations")).failCheck(locationId);}} else { //离得近{ //ScriptTaskNode: 成功((MockLocations)ObjectFactory.getInstance("com.alibaba.compileflow.demo.mock.MockLocations")).successCheck(locationId);}} //AutoTaskNode: 返回验证结果
checkResult = ((MockSpringBean)BeanProvider.getBean("mockSpringBean")).checkLocation(locationId, longitude, latitude);
_pResult.put("checkResult", checkResult);return _pResult;}
7.脚本节点: scriptTask
7.1 xml代码
<scriptTask id="9" name="成功" g="132,189,88,48">
<var name="locationId" description="地址id" dataType="java.lang.Integer" contextVarName="locationId" inOutType="param">
7.2 字段说明
脚本节点和自动节点差不多含义.就是执行一段逻辑.只是自动节点可以执行一个springBean或者一个javaBean.而脚本节点指定的是一个表达式.目前支持QL表示环境执行.例如上面会编译成javaCode:
//ScriptTaskNode: 成功((MockLocations)ObjectFactory.getInstance("com.alibaba.compileflow.demo.mock.MockLocations")).successCheck(locationId);
8.循环节点
8.1 xml代码
<loopProcess id="13" name="循环节点" collectionVarName="pList" variableName="p" indexVarName="i" variableClass="java.lang.String" startNodeId="13-1" endNodeId="13-1" g="20,75,198,190">
<transition to="8" g=":-15,20"></transition>
<autoTask id="13-1" name="每人唱一首歌" g="50,80,88,48">
<action type="spring-bean">
<actionHandle bean="mockSpringBean" clazz="com.alibaba.compileflow.demo.mock.MockSpringBean" method="sing">
<var name="p1" dataType="java.lang.String" contextVarName="p" inOutType="param"></var> </actionHandle> </action>
</autoTask>
</loopProcess>
8.2 字段说明
循环节点的作用是,包裹部分流程进行循环执行.collectionVarName表示要循环的列表变量.variableName表示每个循环的局部变量.indexVarName表示循环的次数.如上面的协议会翻译下面的javaCode:
int i = -1;
for (String p : pList) {
i++;
//AutoTaskNode: 每人唱一首歌((MockSpringBean)BeanProvider.getBean("mockSpringBean")).sing((String)DataType.transfer(p, String.class));}
以上内容源于:https://blog.csdn.net/qq_32447301/article/details/118890003
https://github.com/alibaba/compileflow
如果存在疑问,可以下方评论也可以加QQ 641200958一起讨论