服务热线
135-6963-3175
任务是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;