Activity-(五)HelloWorld实现

HelloWorld

做一个最简单的HellWorld流程用代码的方式实现并且走完流程。

以下是涉及到的比较重要的八张表

SELECT * FROM act_re_deployment;   -- 一 流程部署表
 
SELECT * FROM act_ge_bytearray;    -- 二 流程二进制表
 
SELECT * FROM act_re_procdef;      -- 三 流程定义表
 
SELECT * FROM act_ru_execution;    -- 四 流程正在运行表
 
SELECT * FROM act_hi_procinst;     -- 五 流程实例历史表
 
SELECT * FROM act_ru_task;         -- 六 流程当前任务表
 
SELECT * FROM act_hi_taskinst;     -- 七 流程历史任务表
 
SELECT * FROM act_hi_actinst;      -- 八 流程历史活动节点表

相关步骤如下:

1.首先是需要部署流程定义。

2.启动流程实例。

3.查看流程任务以及完成流程任务。

先决工作,成员变量定义

  1. 获取流程实例引擎ProcessEngines;

  2. 获取RepositoryService;

  3. 获取RuntimeService;

  4. 获取TaskService;

  5. 获取HistoryService

     /**
      * 获取默认的流程引擎实例 会自动读取activiti.cfg.xml文件 
      */
     private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
     
     
     //定义一个成员变量
     RepositoryService repositoryService;
     
     RuntimeService runtimeService;
     
     TaskService taskService;
     
     HistoryService historyService;
     
     /**
      * 获取流程引擎
      */
     @Before
     public void setUp() throws Exception {
         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
         repositoryService = processEngine.getRepositoryService();
         runtimeService = processEngine.getRuntimeService();
         taskService = processEngine.getTaskService();
         historyService = processEngine.getHistoryService();
         
     }
    

部署流程定义图:

	/**
	 * 部署流程定义
	 */
	@Test
	public void deploy(){
	    // 获取部署对象
	    Deployment deployment=processEngine.getRepositoryService() // 部署Service
	                 .createDeployment()  // 创建部署
	                 .addClasspathResource("diagrams/MyProcess.bpmn")  // 加载资源文件
//	                 .addClasspathResource("diagrams/helloWorld.png")   // 加载资源文件
//	                 .name("HelloWorld流程")  // 流程名称
	                 .deploy(); // 部署
	    System.out.println("流程部署ID:"+deployment.getId());
	    System.out.println("流程部署Name:"+deployment.getName());
	}

执行结果:

流程部署ID:17501
流程部署Name:null

接着启动流程实例,这样一个流程才开始:

	/**
     * 启动流程
     */
    @Test
    public void startProcess() {
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
        String processInstanceId = processInstance.getId();
        String activityId = processInstance.getActivityId();
        String definitionId = processInstance.getProcessDefinitionId();
        
        System.out.println("流程实例ID:"+processInstanceId);
        System.out.println("正在活动的节点ID:"+activityId);
        System.out.println("流程定义ID:"+definitionId);
    }

执行结果:

流程实例ID:20001
正在活动的节点ID:usertask1
流程定义ID:myProcess:2:17504

查询正在运行的实例:

	/**
     * 查询正在运行的实例
     */
    @Test
    public void queryExecution(){
        List executionList = runtimeService.createExecutionQuery()  //创建正在执行的流程查询对象
                      .processDefinitionKey("myProcess")   //根据流程定义的key查询
                      .orderByProcessInstanceId()  //根据流程实例id排序
                      .desc()  //倒序
                      .list();  //查询出集合
        for(Execution execution: executionList){
            System.out.println("正在执行的流程对象的id: "+execution.getId());
            System.out.println("所属流程实例的id:"+execution.getProcessInstanceId());
            System.out.println("正在活动的节点的id: "+execution.getActivityId());
            System.out.println("任务名称: "+execution.getName());
        }
    }

执行结果:

正在执行的流程对象的id: 20001
所属流程实例的id:20001
正在活动的节点的id: usertask1
任务名称: null

查看一下白夜行这个用户的任务信息:

	/**
     * 根据办理人查询任务
     */
    @Test
    public void queryTaskByAssignee(){
        String assignee = "白夜行";    // assignee 要与流程图上的 Assignee 相同才会被查询到,否则就不返回该任务对象
        // 查询并且返回任务即可
        List taskList = taskService.createTaskQuery()  // 任务相关Service // 创建任务查询
                                     .processDefinitionKey("myProcess")
                                     .taskAssignee(assignee)// 指定某个人
                                     .orderByTaskCreateTime()
                                     .desc()
                                     .list();
        
        for(Task task: taskList){
	        System.out.println("任务ID:"+task.getId());
	        System.out.println("任务名称:"+task.getName());
	        System.out.println("任务创建时间:"+task.getCreateTime());
	        System.out.println("任务委派人:"+task.getAssignee());
	        System.out.println("流程实例ID:"+task.getProcessInstanceId());
        }
    }

执行结果:

任务ID:20004
任务名称:myprocess
任务创建时间:Thu Mar 12 10:02:57 CST 2020
任务委派人:白夜行
流程实例ID:20001

查询当前流程实例状态

	/**
     * 查询当前流程实例状态
     */
    @Test
    public void queryProInstanceStateByProInstanceId(){
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("12501").singleResult();
        if(processInstance == null){
            System.out.println("当前流程已经完成");
        }else{
            System.out.println("当前流程实例ID:"+processInstance.getId());
            System.out.println("当前流程所处的位置:"+processInstance.getActivityId());
        }
    }	

执行结果:

当前流程实例ID:20001
当前流程所处的位置:usertask1

最后完成HelloWorld节点任务,把流程走完:

	/**
	 * 完成任务
	 */
	@Test
	public void completeTask(){

		TaskQuery query = taskService.createTaskQuery();			//创建任务查询对象
		List list = query.processDefinitionKey("myProcess")	//指定流程定义
							   .taskAssignee("白夜行")				//指定委托人
							   .list();								//执行查询
		for (Task task : list) {
			System.out.println(task);
			//taskService某些框架下需要使用@Autowired注解装配
			taskService.complete(task.getId());						//完成任务,使任务进入下一步
		}
	}

查询流程实例历史

	/**
	 * 查询流程实例历史
	 */
	@Test
	public void queryHistory(){
		
		//1.创建流程实例的历史查询对象,historyService使用@Autowired注解注入
		HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery();
		HistoricProcessInstance instance = 
				query
					.processInstanceId("12501")	//流程实例的id
					.finished()					//调用这个方法后未完成的流程实例会返回null
					.singleResult();
		System.out.println(instance);
	}

这里引出一个概念,流程定义和流程实例的关系,可以把这两种关系理解成是类和对象的关系。 

流程定义是一个模板,而流程实例就是通过模板演变出来的具体的可用的东西。

首先当运行:deploy()部署流程定义方法,在数据库中流程定义表会发生一些变化新增了一条数据,

act_re_deployment流程定义部署表:

然后act_re_prodef流程定义表也会有一条数据插入:

以及在act_ge_bytearray表中用来存储资源信息:

接着来运行start()启动流程实例:

act_ru_task运行时流程任务表新增了一条数据:

act_ru_execution 运行时流程执行表:

act_ru_identitulink是用于执行主体相关信息表:

可以查看刚刚"白夜行”这个用户的任务:

运行findTask()查看用户任务,控制台输出如下:

任务ID:20004
任务名称:myprocess
任务创建时间:Thu Mar 12 10:02:57 CST 2020
任务委派人:白夜行
流程实例ID:20001

completeTask()方法完成任务:

然后数据库中ru开头的运行时候所有表的数据都没了,因为现在流程结束,不需要这些数据了。

在hi开头的表里,会新增不少数据,这些数据主要是用来归档查询用的,也就是历史数据。

act_hi_taskinst 历史流程实例任务表加了一条任务数据;

act_hi_procinst 历史流程实例实例表加了一条流程实例相关信息的数据(包括开始时间,结束时间等等信息);

act_hi_identitylink 历史流程实例参数者的表加了一条数据;

act_hi_actinst 历史活动节点表加了三条流程活动节点信息的数据(每个流程实例具体的执行活动节点的信息);
转载自 :Activity-(五)HelloWorld实现

你可能感兴趣的:(Activiti工作流入门)