1. 任务参数
1.1 基本数据类型参数
ACT_RU_VARIABLE
代码
package com.study.c10;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import java.util.UUID;
public class VarTest {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
String taskId = UUID.randomUUID().toString();
Task task = taskService.newTask(taskId);
task.setName("test");
taskService.saveTask(task);
taskService.setVariable(taskId, "var1", "hello");
System.out.println(taskService.getVariable(taskId,"var1"));
}
}
控制台输出:
hello
ACT_RU_VARIABLE新增一条数据,可见值‘hello’保存于TEXT_字段中,
由本表的DDL可看出对于基本数据类型,仅需要保存于ACT_RU_VARIABLE表
CREATE TABLE `ACT_RU_VARIABLE` (
`ID_` varchar(64) COLLATE utf8_bin NOT NULL,
`REV_` int(11) DEFAULT NULL,
`TYPE_` varchar(255) COLLATE utf8_bin NOT NULL,
`NAME_` varchar(255) COLLATE utf8_bin NOT NULL,
`EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`BYTEARRAY_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`DOUBLE_` double DEFAULT NULL,
`LONG_` bigint(20) DEFAULT NULL,
`TEXT_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`TEXT2_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ID_`),
KEY `ACT_IDX_VARIABLE_TASK_ID` (`TASK_ID_`),
KEY `ACT_FK_VAR_EXE` (`EXECUTION_ID_`),
KEY `ACT_FK_VAR_PROCINST` (`PROC_INST_ID_`),
KEY `ACT_FK_VAR_BYTEARRAY` (`BYTEARRAY_ID_`),
CONSTRAINT `ACT_FK_VAR_BYTEARRAY` FOREIGN KEY (`BYTEARRAY_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`),
CONSTRAINT `ACT_FK_VAR_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`),
CONSTRAINT `ACT_FK_VAR_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
1.2 序列化参数
ACT_RU_VARIABLE + ACT_GE_BYTEARRAY
package com.study.c10;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import java.util.UUID;
public class VarSerialTest {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
String taskId = UUID.randomUUID().toString();
Task task = taskService.newTask(taskId);
task.setName("test");
taskService.saveTask(task);
Person person = new Person(1, "Kevin");
taskService.setVariable(taskId, "object", person);
System.out.println(taskService.getVariable(taskId,"object",Person.class));
}
}
控制台输出:
Person{id=1, name='Kevin'}
ACT_RU_VARIABLE新增一条数据,注意到BYTEARRAY_ID_有值关联到ACT_GE_BYTEARRAY表
ACT_GE_BYTEARRAY表
2. 参数作用域
前面提及的setVariable方法设置的变量为全局变量。
2.1 本地参数
仅在当前任务中有效,在任务完成前都可以拿到参数,但是当流程流转到下一个节点(如task执行了complete完成),参数就拿不到了
API
taskService.setVariablesLocal(task.getId(),params);
package com.study.c10;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import java.util.HashMap;
public class VarLocal {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("var_local.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.deploymentId(deployment.getId()).singleResult();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
HashMap<String, Object> params = new HashMap<>();
params.put("var1","test");
taskService.setVariablesLocal(task.getId(),params);
Object var = taskService.getVariable(task.getId(), "var1");
System.out.println(task.getName() + " : " + var);
//完成任务
taskService.complete(task.getId());
//再次查询
task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
var = taskService.getVariableLocal(task.getId(), "var1");
System.out.println(task.getName() + " : " + var);
}
}
控制台输出:
UserTask : test
UserTask : null
通过bpmn文件配置本地参数
<process id="var_local" isClosed="false" isExecutable="true" processType="None">
<dataObject id="personName" name="personName" itemSubjectRef="xsd:string">
<extensionElements>
<activiti:value>Kevin</activiti:value>
</extensionElements>
</dataObject>
<startEvent id="_2" name="StartEvent"/>
<userTask activiti:exclusive="true" id="_3" name="UserTask"/>
<userTask activiti:exclusive="true" id="_4" name="UserTask"/>
<endEvent id="_5" name="EndEvent"/>
<sequenceFlow id="_6" sourceRef="_2" targetRef="_3"/>
<sequenceFlow id="_7" sourceRef="_3" targetRef="_4"/>
<sequenceFlow id="_8" sourceRef="_4" targetRef="_5"/>
</process>
代码
package com.study.c10;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
public class VarLocal {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("var_local.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.deploymentId(deployment.getId()).singleResult();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
Object var = taskService.getVariable(task.getId(), "personName");
System.out.println(task.getName() + " : " + var);
//完成任务
taskService.complete(task.getId());
//再次查询
task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
var = taskService.getVariableLocal(task.getId(), "personName");
System.out.println(task.getName() + " : " + var);
}
}
控制台输出:
UserTask : Kevin
UserTask : null
2.2 全局参数
略
3. 任务附件管理
在实际生活中,许多的流程都会带上一些任务相关的附件,例如报销流程有可能需要附上发票的单据、奖惩流程有可能会附上相关的说明文件,为此,TaskService中提供了附件管理的API,通过调用这些API,可以对任务附件进行创建、删除和查询的操作。
Activiti中使用附件表(ACT_HI_ATTACHMENT)保存任务附件数据,与该对应的实体类为AttachmentEntityImpl。