一、变量设置以及涉及三张表说明
启动流程设置变量:
/**
* ------------------------------------------------------------------------------------------------------------------------
* insert into ACT_HI_VARINST ( ID_, PROC_DEF_KEY_, PROC_DEF_ID_, ROOT_PROC_INST_ID_, PROC_INST_ID_, EXECUTION_ID_, ACT_INST_ID_, TENANT_ID_, CASE_DEF_KEY_, CASE_DEF_ID_, CASE_INST_ID_, CASE_EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, CREATE_TIME_, REMOVAL_TIME_, BYTEARRAY_ID_, DOUBLE_, LONG_, TEXT_, TEXT2_, STATE_ ) values ( '3802', 'var', 'var:1:3403', '3801', '3801', '3801', '3801', 'a', null, null, null, null, null, 'var2', 0, 'string', '2021-03-10 15:23:01.259', null, null, null, null, '变量2', null, 'CREATED' );
* ------------------------------------------------------------------------------------------------------------------------
* insert into ACT_HI_TASKINST ( ID_, PROC_DEF_KEY_, PROC_DEF_ID_, ROOT_PROC_INST_ID_, PROC_INST_ID_, EXECUTION_ID_, CASE_DEF_KEY_, CASE_DEF_ID_, CASE_INST_ID_, CASE_EXECUTION_ID_, ACT_INST_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_, DELETE_REASON_, TASK_DEF_KEY_, PRIORITY_, DUE_DATE_, FOLLOW_UP_DATE_, TENANT_ID_, REMOVAL_TIME_ ) values ( '3809', 'var', 'var:1:3403', '3801', '3801', '3801', null, null, null, null, 'Activity_0dhhxgy:3808', '请假申请', null, null, null, null, '2021-03-10 15:23:01.264', null, null, null, 'Activity_0dhhxgy', 50, null, null, 'a', null );
* ------------------------------------------------------------------------------------------------------------------------
* insert into ACT_HI_PROCINST ( ID_, PROC_INST_ID_, BUSINESS_KEY_, PROC_DEF_KEY_, PROC_DEF_ID_, START_TIME_, END_TIME_, REMOVAL_TIME_, DURATION_, START_USER_ID_, START_ACT_ID_, END_ACT_ID_, SUPER_PROCESS_INSTANCE_ID_, ROOT_PROC_INST_ID_, SUPER_CASE_INSTANCE_ID_, CASE_INST_ID_, DELETE_REASON_, TENANT_ID_, STATE_ ) values ( '3801', '3801', null, 'var', 'var:1:3403', '2021-03-10 15:23:01.253', null, null, null, null, 'StartEvent_1', null, null, '3801', null, null, null, 'a', 'ACTIVE' );
* ------------------------------------------------------------------------------------------------------------------------
* insert into ACT_HI_ACTINST ( ID_, PARENT_ACT_INST_ID_, PROC_DEF_KEY_, PROC_DEF_ID_, ROOT_PROC_INST_ID_, PROC_INST_ID_, EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, CALL_CASE_INST_ID_, ACT_NAME_, ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_, ACT_INST_STATE_, SEQUENCE_COUNTER_, TENANT_ID_, REMOVAL_TIME_ ) values ( 'Activity_0dhhxgy:3808', '3801', 'var', 'var:1:3403', '3801', '3801', '3801', 'Activity_0dhhxgy', '3809', null, null, '请假申请', 'userTask', null, '2021-03-10 15:23:01.261', null, null, 0, 3, 'a', null );
* ------------------------------------------------------------------------------------------------------------------------
* insert into ACT_RU_EXECUTION ( ID_, ROOT_PROC_INST_ID_, PROC_INST_ID_, BUSINESS_KEY_, PROC_DEF_ID_, ACT_ID_, ACT_INST_ID_, IS_ACTIVE_, IS_CONCURRENT_, IS_SCOPE_, IS_EVENT_SCOPE_, PARENT_ID_, SUPER_EXEC_, SUPER_CASE_EXEC_, CASE_INST_ID_, SUSPENSION_STATE_, CACHED_ENT_STATE_, SEQUENCE_COUNTER_, TENANT_ID_, REV_ ) values ( '3801', '3801', '3801', null, 'var:1:3403', 'Activity_0dhhxgy', 'Activity_0dhhxgy:3808', true, false, true, false, null, null, null, null, 1, 18, 3, 'a', 1 );
* ------------------------------------------------------------------------------------------------------------------------
* insert into ACT_RU_TASK ( ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_, DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_, CASE_EXECUTION_ID_, CASE_INST_ID_, CASE_DEF_ID_, TASK_DEF_KEY_, DUE_DATE_, FOLLOW_UP_DATE_, SUSPENSION_STATE_, TENANT_ID_, REV_ ) values ( '3809', '请假申请', null, null, 50, '2021-03-10 15:23:01.261', null, null, null, '3801', '3801', 'var:1:3403', null, null, null, 'Activity_0dhhxgy', null, null, 1, 'a', 1 );
* ------------------------------------------------------------------------------------------------------------------------
* insert into ACT_GE_BYTEARRAY(ID_, NAME_, BYTES_, DEPLOYMENT_ID_, TENANT_ID_, TYPE_, CREATE_TIME_, ROOT_PROC_INST_ID_, REMOVAL_TIME_, REV_) values ( '3804', 'person', java.io.ByteArrayInputStream@2f3c6ac4(ByteArrayInputStream), null, null, 2, '2021-03-10 15:23:01.252', null, null, error, 1 );
* ------------------------------------------------------------------------------------------------------------------------
* insert into ACT_RU_VARIABLE ( ID_, TYPE_, NAME_, PROC_INST_ID_, EXECUTION_ID_, CASE_INST_ID_, CASE_EXECUTION_ID_, TASK_ID_, BYTEARRAY_ID_, DOUBLE_, LONG_, TEXT_, TEXT2_, VAR_SCOPE_, SEQUENCE_COUNTER_, IS_CONCURRENT_LOCAL_, TENANT_ID_, REV_ ) values ( '3802', 'string', 'var2', '3801', '3801', null, null, null, null, null, null, '变量2', null, '3801', 1, false, 'a', 1 );
* ------------------------------------------------------------------------------------------------------------------------
*/
@Test
public void startProcessInstanceByKey() {
VariableMap variableMap = Variables.createVariables()
.putValue("var1", "变量1")
.putValue("var2", "变量2")
.putValue("person", new Person(18, "peng"));
runtimeService.startProcessInstanceByKey("var", variableMap);
}
完成任务设置变量:
@Test
public void complete() {
VariableMap variableMap = Variables.createVariables()
.putValue("var1", "变量11")
.putValue("var2", "变量22")
.putValue("person", new Person(19, "peng"));
taskService.complete("3809", variableMap);
}
此时,原有变量会被覆盖
二、变量获取及序列化变量使用
手工变量设置:
变量获取:
@Test
public void getRuntimeServiceVariables() {
String executionId = "3801";
Map<String, Object> variables = runtimeService.getVariables(executionId);
System.out.println(variables);
Object var1 = runtimeService.getVariable(executionId, "var1");
System.out.println("#####" + var1);
List<String> varParams = new ArrayList<String>();
varParams.add("var1");
varParams.add("var2");
Map<String, Object> variables1 = runtimeService.getVariables(executionId, varParams);
System.out.println(variables1);
VariableMap variablesTyped = runtimeService.getVariablesTyped(executionId);
Object var11 = variablesTyped.get("var1");
System.out.println("#####" + var11);
// VariableMap variablesTyped1 = runtimeService.getVariablesTyped(executionId, false);
// Object person = variablesTyped1.get("person");
// System.out.println("#####" + person);
}
@Test
public void getTaskServiceVariables() {
String taskId = "3904";
Map<String, Object> variables = taskService.getVariables(taskId);
System.out.println(variables);
Object var1 = taskService.getVariable(taskId, "var1");
System.out.println("#####" + var1);
List<String> varParams = new ArrayList<String>();
varParams.add("var1");
varParams.add("var2");
Map<String, Object> variables1 = taskService.getVariables(taskId, varParams);
System.out.println(variables1);
VariableMap variablesTyped = taskService.getVariablesTyped(taskId);
Object var11 = variablesTyped.get("var1");
System.out.println("#####" + var11);
}
变量设置:
@Test
public void runtimeServiceSetVariable() {
String executionId = "3801";
runtimeService.setVariable(executionId, "p1", "peng1");
VariableMap variableMap = Variables.createVariables()
.putValue("var1", "变量111")
.putValue("var2", "变量222")
.putValue("person", new Person(18, "peng"));
runtimeService.setVariables(executionId,variableMap);
}
@Test
public void taskServiceSetVariable() {
String taskId = "3904";
taskService.setVariable(taskId, "p1", "peng1");
VariableMap variableMap = Variables.createVariables()
.putValue("var1", "变量1111")
.putValue("var2", "变量2222")
.putValue("person", new Person(18, "peng"));
taskService.setVariables(taskId,variableMap);
}
设置局部变量使用:setVariableLocal
三、历史明细变量获取
@Test
public void createHistoricDetailQuery() {
List<HistoricDetail> list = historyService
.createHistoricDetailQuery()
.processInstanceId("1701")
.activityInstanceId("Task_11w89:1734")
.list();
for (HistoricDetail historicDetail : list) {
System.out.println(historicDetail);
}
}
@Test
public void createHistoricVariableInstanceQuery() {
List<HistoricVariableInstance> list = historyService
.createHistoricVariableInstanceQuery()
.list();
for (HistoricVariableInstance historicVariableInstance : list) {
System.out.println("###########");
System.out.println(historicVariableInstance.getId());
System.out.println(historicVariableInstance.getExecutionId());
System.out.println(historicVariableInstance.getActivityInstanceId());
System.out.println(historicVariableInstance.getName());
System.out.println(historicVariableInstance.getValue());
System.out.println("###########");
}
}
四、变量设置源码分析
引擎支持变量类型说明:
org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl#initValueTypeResolver
protected void initValueTypeResolver() {
if (this.valueTypeResolver == null) {
this.valueTypeResolver = new ValueTypeResolverImpl();
}
}
public class ValueTypeResolverImpl implements ValueTypeResolver {
protected Map<String, ValueType> knownTypes = new HashMap();
public ValueTypeResolverImpl() {
this.addType(ValueType.BOOLEAN);
this.addType(ValueType.BYTES);
this.addType(ValueType.DATE);
this.addType(ValueType.DOUBLE);
this.addType(ValueType.INTEGER);
this.addType(ValueType.LONG);
this.addType(ValueType.NULL);
this.addType(ValueType.SHORT);
this.addType(ValueType.STRING);
this.addType(ValueType.OBJECT);
this.addType(ValueType.NUMBER);
this.addType(ValueType.FILE);
}
public void addType(ValueType type) {
this.knownTypes.put(type.getName(), type);
}
public ValueType typeForName(String typeName) {
return (ValueType)this.knownTypes.get(typeName);
}
public Collection<ValueType> getSubTypes(ValueType type) {
List<ValueType> types = new ArrayList();
Set<ValueType> validParents = new HashSet();
validParents.add(type);
Iterator var4 = this.knownTypes.values().iterator();
while(var4.hasNext()) {
ValueType knownType = (ValueType)var4.next();
if (validParents.contains(knownType.getParent())) {
validParents.add(knownType);
if (!knownType.isAbstract()) {
types.add(knownType);
}
}
}
return types;
}
}
五、临时变量使用
@Test
public void setVariable3() {
String executionId = "3801";
PrimitiveValueTypeImpl.DoubleTypeImpl dateType = new PrimitiveValueTypeImpl.DoubleTypeImpl();
Map<String, Object> map = new HashMap<>();
map.put("transient", false);
DoubleValue doubleValue = dateType.createValue(12D, map);
runtimeService.setVariable(executionId,"var_transient",doubleValue);
//是否是临时的
boolean isTransient=true;
DoubleValue doubleValue1 = Variables.doubleValue(13D, isTransient);
}
@Test
public void setVariable4() {
String executionId = "3801";
VariableMap variableMap = Variables.createVariables()
.putValue("a", Variables.doubleValue(11D, true))
.putValue("b", Variables.doubleValue(11D, false))
.putValue("c", Variables.stringValue("mm", false));
runtimeService.setVariables(executionId, variableMap);
}
代码参考:https://github.com/zhoupengwa/ProcessEngineDemo
学习来源:腾讯课堂