任务是activiti三大元素之一,主要有
UserTask 人工任务
ScriptTask 服务任务
ServiceTask
MailTask
ManualTask
ReceiveTask
BusinessRuleTask
CallActivity
其中,UserTask用户任务最为常用。
1.用户任务 UserTask
看代码:
public class UserTask extends Task {
/**
* 被分配到任务的人
* (受理人):task任务的受理人,就是执行TASK的人,这个又分两种情况(有值,NULL)
* 1),有值的情况:XML流程里面定义的受理人,TASK会直接填入这个人;
* 2),NULL:XML没有指定受理人或者只指定了候选组;
* 没有值的时候,可以使用签收功能去指定受理人,就是候选组里面谁签收谁就成了受理人
*/
protected String assignee;
//(委托人):受理人委托其他人操作该TASK的时候,受理人就成了委托人OWNER_,其他人就成了受理人ASSIGNEE_
protected String owner;
//指定用户任务的优先级,取值区间[0,100] TODO
protected String priority;
/*表单key*/
protected String formKey;
/*过期日期,通常用变量代替而不是设定一个具体的日期*/
protected String dueDate;
//可指定定时器,流程引擎配置中的业务日历的位置 TODO
protected String businessCalendarName;
//流程类别
protected String category;
//TODO
protected String extensionId;
/*
* 所谓组任务,也就是任务的候选人,候选人中的用户有权认领该任务并且完成该任务,当任务被领取之后,其他候选人即无法再看到此任务。
当用户认领任务时,就算该用户不在候选人列表中,依然可以认领任务
* 可以指定多个用户
* */
protected List<String> candidateUsers = new ArrayList<String>();
/**
* 任务组,可以指定角色
*/
protected List<String> candidateGroups = new ArrayList<String>();
/*表单属性
* */
protected List<FormProperty> formProperties = new ArrayList<FormProperty>();
protected List<ActivitiListener> taskListeners = new ArrayList<ActivitiListener>();
/**
* 跳过表达式
* 如:我们在使用Activiti时经常会遇到提交人与审批人是同一个人的问题,这个时候我们就会用到Skip Expression
* 需要开启支持跳过表达式 ActivitiConstanct.getSkipExpression()就是"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
* variables.put(ActivitiConstanct.getSkipExpression(), true);
*/
protected String skipExpression;
/**
*
* 在实际业务中,我们系统可能初期并没有接入工作流,后期接入时就涉及到如何将现有业务表中的用户与Activiti进行对接
* 1.通过继承UserEntityManager、GroupEntityManager
* 2.自定义类CustomUserEntityManagerFactory实现SessionFactory接口
* 3.在Activiti配置中注册自己定义的用户、用户组管理类:
* List<SessionFactory> customSessionFactories = new ArrayList<>();
* customSessionFactories.add(customUserEntityManagerFactory);
* customSessionFactories.add(customGroupEntityManagerFactory);
* processEngineConfiguration.setCustomSessionFactories(customSessionFactories);
*/
//自定义用户身份
protected Map<String, Set<String>> customUserIdentityLinks = new HashMap<String, Set<String>>();
//自定义用户组
protected Map<String, Set<String>> customGroupIdentityLinks = new HashMap<String, Set<String>>();
/**
* 用来存储我们的自定义属性
* activiti modeler通过读取stencilset.json生成编辑器UI,在界面上的扩展需要了解stencilset.json配置文件,
* 它定义元素的属性,规则的配置文件,页面的展示就是根据这个配置文件生成的。
*/
protected List<CustomProperty> customProperties = new ArrayList<CustomProperty>();
UI面板:
1.1General
1.2主面板配置
Asynchronous : 是否异步(默认否)表示是否能被异步执行。
Exclusive : 是否排他(默认是)表示同一个流程实例在同一时刻只能由一个人执行该步骤, 跟asynchronous互斥。
is for compensation:是否补偿任务
skip expression:跳过表达式
1.3Listener
增加了Task Listeners
这里叫做任务监听器,和执行监听器大体相同,只是类实现的接口不同。
注意:class需要实现接口
org.activiti.engine.delegate.TaskListener
1.4Muti Instance
sequential是否串行
多实例优先于组任务
ManualTask
手工任务定义了BPM引擎外部的任务。 用来表示工作需要某人完成,而引擎不需要知道,也没有对应的系统和UI接口。
对于引擎,手工任务是直接通过的活动, 流程到达它之后会自动向下执行。
手动任务几乎不在程序中做什么事情,只是在流程的历史中留下一点痕迹,表明流程是走过某些节点的。而且这个任务是无法用taskservice查询到的。
ServiceTask
类型:mail\dmn\mule\camel\shell
mail:activiti强化了业务流程,支持了自动邮件任务,它可以发送邮件给一个或多个参与者, 包括支持cc, bcc, HTML内容等等。注意邮件任务不是BPMN 2.0规范定义的官方任务。 (它也没有对应的图标)
shell:shell任务可以执行shell脚本和命令。 注意shell任务不是BPMN 2.0规范定义的官方任务。 (它也没有对应的图标)。
mule:mule任务可以向mule发送消息,以强化activiti的集成能力。 注意mule任务不是BPMN 2.0规范定义的官方任务。 它也没有对应的图标)。
camel:Camel任务可以从Camel发送和介绍消息,由此强化了activiti的集成功能。 注意camel任务不是BPMN 2.0规范定义的官方任务。 (它也没有对应的图标)
要使用camel任务功能时,也要记得吧activiti camel包含到项目里。
该类的主要字段:
public class ServiceTask extends TaskWithFieldExtensions {
public static final String DMN_TASK = "dmn";
public static final String MAIL_TASK = "mail";
//class类全名或表达式
protected String implementation;
//实现类型 class\expression\delegate Expression\##WebService
protected String implementationType;
//结果变量名
protected String resultVariableName;
//类型:mail\dmn\mule\camel\shell
//<serviceTask id="sendMail" activiti:type="mail">
protected String type;
protected String operationRef;
protected String extensionId;
/**
* 用来存储我们的自定义属性
* activiti modeler通过读取stencilset.json生成编辑器UI,在界面上的扩展需要了解stencilset.json配置文件,
* 它定义元素的属性,规则的配置文件,页面的展示就是根据这个配置文件生成的。
*/
protected List<CustomProperty> customProperties = new ArrayList<CustomProperty>();
//跳过表达式
protected String skipExpression;
...
ReceiveTask
接收任务是一个简单任务,它会等待对应消息的到达。
<receiveTask id="waitState" name="wait" />
要在接收任务等待的流程实例继续执行, 可以调用runtimeService.signal(executionId),传递接收任务上流程的id。
ProcessInstance pi = runtimeService.startProcessInstanceByKey("receiveTask");
Execution execution = runtimeService.createExecutionQuery()
.processInstanceId(pi.getId())
.activityId("waitState")
.singleResult();
assertNotNull(execution);
runtimeService.signal(execution.getId());
ScriptTask
脚本任务时一个自动节点。当流程到达脚本任务, 会执行对应的脚本。
<scriptTask id="script" scriptFormat="groovy" activiti:autoStoreVariables="false">
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
</script>
</scriptTask>
注意:下面这些命名已被占用,不能用作变量名: out, out:print, lang:import, context, elcontext。
该类的主要字段:
public class ScriptTask extends Task {
protected String scriptFormat;
protected String script;
protected String resultVariable;
/**
* 可以在脚本中自动保存任何变量。 (比如上例中的sum),只要把scriptTask 的autoStoreVariables属性设置为true。
* 然而,最佳实践是不要用它,而是显示调用execution.setVariable(), 因为一些当前版本的JDK对于一些脚本语言,无法实现自动保存变量。
* 参数默认为false,意思是如果没有为脚本任务定义设置参数, 所有声明的变量将只存在于脚本执行的阶段。
*
*/
protected boolean autoStoreVariables = false;
...
BusinessRuleTask
业务规则用户用来同步执行一个或多个规则。activiti使用drools规则引擎执行业务规则。
目前,包含业务规则的.drl文件必须和流程定义一起发布,流程定义里包含了执行这些规则的业务规则任务。
意味着流程使用的所有.drl文件都必须打包在流程BAR文件里,比如任务表单。
DefaultActivityBehaviorFactory.createBusinessRuleTaskActivityBehavior
BusinessRuleTaskActivityBehavior
可看下该类主要有哪些字段:
public class BusinessRuleTask extends Task {
//结果参数
protected String resultVariableName;
//可以配置为例外的规则:
// 例:activiti:rules="rule1, rule2" exclude="true" 当exclude为true时,rule1,rule2规则不被执行。
protected boolean exclude;
//规则名称列表 activiti:rules="rule1,rule2"
protected List<String> ruleNames = new ArrayList<String>();
//输入参数
protected List<String> inputVariables = new ArrayList<String>();
//TODO
//你想用不同方式使用drools,或你想使用完全不同的规则引擎, 你可以使用BusinessRuleTask上的class或表达式属性,它用起来就和 ServiceTask一样。
//activiti:class="${MyRuleServiceDelegate}"
protected String className;
持续更新。。。。