纵有疾风起
人生不言弃

Activiti5工作流笔记二


流程变量

import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import org.activiti.engine.ProcessEngine;import org.activiti.engine.ProcessEngines;import org.junit.Test;/** * 在执行流程的过程中产生数据称为流程变量 *    1、流程变量的生命周期 *               就是流程实例 *    2、流程变量和流程实例的关系 *        流程变量必须和流程实例绑定在一起 *    3、通过什么样的方法把一个流程变量存放在流程实例中 *    4、通过什么样的方法把一个流程变量从流程实例中提取出来 *    5、把一个对象放入到流程变量中,该对象必须实现对象的序列化 * @author zd * */public class VariablesTest {    /**     * 涉及到的表     *    act_hi_varinst     varinst:变量实例     *    act_ru_variable    存放当前正在执行的流程实例的流程变量     *         execution_id_:流程实例ID     *         proc_inst_id_:流程实例ID     *       可以根据流程实例ID获取到该流程实例的流程变量     */    @Test    public void testStartPI(){        Map<String, Object> variables = new HashMap<String, Object>();        variables.put("当启动流程实例的时候", "启动流程实例的流程变量");        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        processEngine.getRuntimeService()        //当启动流程实例的时候添加流程变量        .startProcessInstanceByKey("qingjia", variables);    }        /**     * 在完成任务的时候,设置流程变量     */    @Test    public void testFinishTask(){        Map<String, Object> variables = new HashMap<String, Object>();        variables.put("请假天数", 3);        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        processEngine.getTaskService()        .complete("805", variables);    }        /**     * 在流程实例的任何时候(只要流程实例没有结束),设置流程变量     */    @Test    public void testSetVariablesWhenPI(){        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        processEngine.getRuntimeService()            /**             * executionId  针对哪一个流程实例设置流程变量             * variableName  变量的名称             * value  变量的值             */            .setVariable("801", "aaa", "aaa");    }        /**     * 怎么样得到流程变量     */    @Test    public void testGetVariables(){        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        //获取指定的流程实例下面的所有的流程变量        Map<String, Object> variables = processEngine.getRuntimeService()        .getVariablesLocal("801");        for (Entry<String, Object> entry:variables.entrySet()) {            if(entry.getValue() instanceof Person){                Person person = (Person)entry.getValue();                System.out.println(person.getName());            }else{                System.out.println(entry.getKey());                System.out.println(entry.getValue());            }                    }    }        /**     * 在流程实例的任何时候(只要流程实例没有结束),设置流程变量     */    @Test    public void testSetVariables_Object_WhenPI(){        Person person = new Person();        person.setPid(1L);        person.setName("王二麻子");        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        processEngine.getRuntimeService()            /**             * executionId  针对哪一个流程实例设置流程变量             * variableName  变量的名称             * value  变量的值             */            .setVariable("801", "person", person);    }}

person类

import java.io.Serializable;public class Person implements Serializable{    private Long pid;    private String name;    public Long getPid() {        return pid;    }    public void setPid(Long pid) {        this.pid = pid;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }        }

给任务赋值任务的执行人

在进入该节点之前就能确定任务的执行者

流程图中设置流程变量,如下:

Activiti5工作流笔记二插图Activiti5工作流笔记二插图(1)Activiti5工作流笔记二插图(2)

import java.util.HashMap;import java.util.Map;import org.activiti.engine.ProcessEngine;import org.activiti.engine.ProcessEngines;import org.junit.Test;/** * <userTask id="申请请假" name="申请请假" activiti:assignee="#{applicator}"></userTask> * 如果一个任务节点的执行人是通过上面的形式赋值的,那么在进入该节点之前,必须给变量applicator赋值(通过流程变量) * @author zd * */public class Task1Test {    @Test    public void testDeploy(){        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        processEngine.getRepositoryService()        .createDeployment()        .addClasspathResource("com/itheima10/activiti/task/task1.bpmn")        .deploy();    }        /**     * 在启动流程实例的时候,设置流程变量,给aplicator赋值     */    @Test    public void testStartPI(){        Map<String, Object> variables = new HashMap<String, Object>();        variables.put("applicator", "张三");        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        processEngine.getRuntimeService()        .startProcessInstanceById("myProcess:1:1204",variables);    }        /**     * 在完成请假申请任务的时候,设置流程变量     */    @Test    public void testFinishApplicatorTask(){        Map<String, Object> variables = new HashMap<String, Object>();        variables.put("manager", "李四");        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        processEngine.getTaskService()        .complete("1305", variables);    }        /**     * 在完成部门经理审批的任务的时候,设置流程变量,给总经理任务的执行人赋值     */    @Test    public void testFinishManagerTask(){        Map<String, Object> variables = new HashMap<String, Object>();        variables.put("boss", "王五");        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        processEngine.getTaskService()        .complete("1403", variables);    }        /**     * 完成总经理的任务     */    @Test    public void testFinishBossTask(){        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        processEngine.getTaskService()        .complete("1503");    }}

 在进入该节点之后,才要确定节点的执行者是谁

流程图如下:

Activiti5工作流笔记二插图(3)Activiti5工作流笔记二插图(4)Activiti5工作流笔记二插图(5)

1、可以通过MyTaskListener的方式给任务赋值执行人
 <userTask id=”部门经理审批” name=”部门经理审批”>
<extensionElements>
<activiti:taskListener event=”create” class=”com.itheima10.activiti.task.MyTaskListener”></activiti:taskListener>
</extensionElements>
</userTask>
当进入上述的userTask节点之后,立刻执行MyTaskListener的notify方法
delegateTask.setAssignee(manager);就是给MyTaskListener所在的任务节点赋值任务的执行人
说明:该类是由activiti内部调用的,不是由spring容器产生的,所以在notify方法中没有办法使用spring的声明式事务处理产生事务
2、可以通过代码的方式设置任务的执行人
processEngine.getTaskService()
.setAssignee(taskId, userId);
通过该方式也可以给正在执行的任务赋值任务的执行人

package com.itheima10.activiti.task;import java.util.HashMap;import java.util.List;import java.util.Map;import org.activiti.engine.ProcessEngine;import org.activiti.engine.ProcessEngines;import org.activiti.engine.task.Task;import org.junit.Test;public class Task2Test {    @Test    public void testDeploy(){        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        processEngine.getRepositoryService()        .createDeployment()        .addClasspathResource("com/itheima10/activiti/task/task2.bpmn")        .deploy();    }        /**     * 启动流程实例,并且给流程变量 applicator,manager赋值     */    @Test    public void testStartPI(){        Map<String, Object> variables = new HashMap<String, Object>();        variables.put("applicator", "张三");        variables.put("manager","李四");        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        processEngine.getRuntimeService()        .startProcessInstanceById("task2:1:2104", variables);    }        /**     * 根据张三查询任务     */    @Test    public void testQueryTaskByAssignee(){        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        List<Task> tasks = processEngine.getTaskService()        .createTaskQuery()        .taskAssignee("张三")        .orderByTaskCreateTime()        .desc()        .list();                for (Task task : tasks) {            System.out.println(task.getAssignee());            System.out.println(task.getName());        }    }        @Test    public void testFinishTask(){        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        processEngine.getTaskService().complete("2206");            }}
package com.itheima10.activiti.task;import org.activiti.engine.delegate.DelegateTask;import org.activiti.engine.delegate.TaskListener;public class MyTaskListener implements TaskListener{    /**     *      */    private static final long serialVersionUID = 1830618442071409874L;    @Override    public void notify(DelegateTask delegateTask) {        String manager = delegateTask.getVariable("manager").toString();        delegateTask.setAssignee(manager);                /**         *    获得spring容器中的bean 
      *   WebApplicationContext ac = * WebApplicationContextUtils. * getWebApplicationContext(ServletActionContext.getServletContext()); IEmployeeService employeeService = (IEmployeeService) ac.getBean("employeeService");
*/ }}

 

文章转载于:https://www.cnblogs.com/lm970585581/p/9310939.html

原著是一个有趣的人,若有侵权,请通知删除

未经允许不得转载:起风网 » Activiti5工作流笔记二

分享到: 生成海报
avatar

评论 抢沙发

评论前必须登录!

立即登录   注册

切换注册

登录

忘记密码 ?

切换登录

注册

我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活