一、设置流程变量:4种
流程图:
①:启动流程的时候设置
public void test1() throws Exception {
//获取核心对象服务
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取服务
RuntimeService runtimeService = processEngine.getRuntimeService();
//设置流程变量
Map<String, Object> map=new HashMap();
map.put("cardID", "4202222");//卡号
map.put("moeny", 55.50);//钱
map.put("time", new Date());//时间
map.put("is", true);//是否有会员卡
map.put("user",new User(1, "kd", "123465"));//创建一个user对象
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave",map);
System.out.println(processInstance);
}
②:任务完成的时候设置
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
Map<java.lang.String, Object> variables2 = taskService.getVariables(taskId);
//zs 完成
//添加流程变量代表申请的原因
Map<String, Object> map=new HashMap<>();
map.put("reson", "上火需要请假");
map.put("date", "一天");
//存在的流程变量名如果相同,则覆盖
map.put("is", false);
taskService.complete(taskId,map);
③:runtimeService设置
④:taskService设置
这两点以上代码已给出.
二、获取流程变量:2种
①:runtimeService获取变量
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
String executionId="2501";//在表中查询2511 id
String variableName="cardID";//要卡号
Map<java.lang.String, Object> variables = runtimeService.getVariables(executionId);
System.out.println(variables);
②:taskService获取变量
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
String taskId="7504";
Map<java.lang.String, Object> variables = taskService.getVariables(taskId);
System.out.println(variables);
注意:
1.流程变量应该可以被所有的执行对象获取(只要流程实例不结束,流程变量可以在任何地方获取)
2.流程变量是可以覆盖的
例如我在启动流程时设置了一个is的值
//获取服务
RuntimeService runtimeService = processEngine.getRuntimeService();
//设置变量
Map<String, Object> map=new HashMap();
map.put("is", true);//是否有会员卡
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave",map);
我完成任务时在添加一个is然后赋值为false
TaskService taskService = processEngine.getTaskService();
Map<String, Object> map=new HashMap<>();
//存在的流程变量名如果相同,则覆盖
map.put("is", false);
taskService.complete(taskId,map);
在后面的流程获取is这个值时就为false了
3.如果存放domain实体类的话就需要这个实体类实现序列化接口 Serializable
//设置变量
Map<String, Object> map=new HashMap();
map.put("cardID", "4202222");//卡号
map.put("moeny", 55.50);//钱
map.put("time", new Date());//时间
map.put("is", true);//是否有会员卡
map.put("user",new User(1, "kd", "123465"));//创建一个user对象
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave",map);
System.out.println(processInstance);
以下错误就是没有继承序列化接口
org.activiti.engine.ActivitiException: couldn't find a variable type that is able to serialize _01_var.User@79517588
at org.activiti.engine.impl.variable.DefaultVariableTypes.findVariableType(DefaultVariableTypes.java:62)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.createVariableInstance(VariableScopeImpl.java:837)
at org.activiti.engine.impl.persistence.entity.ExecutionEntity.createVariableInstance(ExecutionEntity.java:1194)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.createVariableLocal(VariableScopeImpl.java:752)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.createVariableLocal(VariableScopeImpl.java:739)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.setVariable(VariableScopeImpl.java:633)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.setVariable(VariableScopeImpl.java:590)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.setVariables(VariableScopeImpl.java:534)
at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.initializeVariables(StartProcessInstanceCmd.java:117)
at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:102)
at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:37)
at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)
at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)
at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:37)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
at org.activiti.engine.impl.RuntimeServiceImpl.startProcessInstanceByKey(RuntimeServiceImpl.java:82)
at _01_var.VarTest.test1(VarTest.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)