流程图活动包括:
1:开始活动
不能有分支,不能有多个开始活动,连线不能指向开始活动
2:结束活动
end 普通结束
end-cancel 取消结束
end-error 异常结束
PS:每个结束虽然长的不一样,功能一样,不一样的地方体现在his_task里的COUCOME描述,主要针对不用业务
3:状态活动state
指的是流程走到该状态节点就停了,如果继续往下走只能调用
processEngine.getExecutionService().singalExecutionById(executionId,"连线name")进行通知才能往下走。
例如业务逻辑:当走到某节点需要所有人做反馈,当所有人反馈有调用上面的api进行唤醒
PS:走到该节点在task表里没数据,在execution表里会记录当前节点是属于state状态,等待唤醒
4:判断活动 decision
4.1:定义一个decisionhandle类,实现 DecisionHandle接口里的decide函数,返回的是判断活动下一步的路线
public class PriceDecisionHandle implements DecisionHandler {
/**
* 执行判断,返回的是连线
*/
@Override
public String decide(OpenExecution execution) {
// TODO Auto-generated method stub
String linkName = "to task2";
double price = (double) execution.getVariable("price");
if (price > 200) {
linkName = "to task3";
}
System.out.println(linkName);
return linkName;
}
}
4.2:指定的decision的handle class ,见图片
4.3:在启动或执行task任务时设置流程变量
//启动时设置流程变量
String executionId = "financeDecision-1";
Map<String, Object> map = new HashMap<String, Object>();
map.put("price", 580d);
ProcessInstance processInstance = pe.getExecutionService().startProcessInstanceById(executionId, map);
4.4 当teamleader任务用户执行任务时会通过反射路径执行 decide函数 返回路径 跳转到指定的task
5:分支合并活动
PS:使用场景,当一个流程需要2个人同时审批才能通过,如图(CEO和CFO同时审批后才能END)
启动时在task表里会同时存储2条数据,在CEO和CFO全都执行完各自的任务后才能进行join合并并且end结束。
6:自定义活动
PS:自定义活动是用户可以自定义自己的行为,定义一个实现类,实现ExternalActivityBehaviour,其中可分为2中执行策略 1:执行完毕后直接跳转到下一个流程节点2:在该自定义节点停留等待唤醒(execute函数里执行ActivityExecution类型参数的wait函数execution. waitForSignal()),如图

public class Customer implements ExternalActivityBehaviour {
/**
* 不管哪种策略都会执行该函数,也是第一步执行
*/
@Override
public void execute(ActivityExecution execution) throws Exception {
// TODO Auto-generated method stub
execution.waitForSignal(); //等待唤醒之后执行signal
System.out.println("execute执行");
}
/**
* 只有当execute(...)里执行了execution.waitForSignal()函数代表等待,之后执行(precessEngine.
* getExecutionService().signalsignalExecutionById())才会进行执行该函数
*/
@Override
public void signal(ActivityExecution arg0, String arg1, Map<String, ?> arg2) throws Exception {
// TODO Auto-generated method stub
System.out.println("signal执行");
}
}