Activiti7工作流引擎之流程创建及调用过程

目录

 

第一步:流程定义

​第二步:流程部署

 第三步:流程启动

第四步:查询用户任务

注:这里有个问题是在eclipse中没有idea那样可以给某个任务环节分配用户,没找到!!!!!!

第五步:流程处理


第一步:流程定义

创建工作流引擎的流程图

第二步:流程部署

就是将流程图中定义的信息(.bpmn文件和pang图片)保存到数据库中

package org.wxy.com.activiti;

import java.util.Date;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.junit.Test;

/**
 * Unit test for simple App.
 */
public class AppTest {
	
	
	//流程部署
	@Test
	public  void testprocessdeploy(){
		//获取流程引擎
		ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
		
		//通过流程架构知道所有的service都是通过ProcessEngine调用的
		//创建部署对象
		RepositoryService  repositoryService  = processEngine.getRepositoryService();
		
		repositoryService.createDeployment().addClasspathResource("leveldef.bpmn")
		                                     .addClasspathResource("leveldef.png")
		                                     .name("请假审批流程")
		                                     .activateProcessDefinitionsOn(new Date())
		                                     .deploy();
		
    }
	
}

 分析执行流程部署操作涉及到的表

act_re_deployment    记录部署信息

act_re_procdef        记录流程定义的信息

act_ge_bytearray   记录定义的bpmn文件和pang文件

 第三步:流程启动

package org.wxy.com.activiti;

import java.util.Date;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;

/**
 * Unit test for simple App.
 */
public class AppTest {
	
	//流程实例的启动
	@Test
	public  void testprocessstart(){
		//获取流程引擎
		ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
		//创建流程启动对象
		RuntimeService runtimeService = processEngine.getRuntimeService();
		//根据流程定义的key,启动某一个流程实例
		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
		System.out.println("活动id"+	processInstance.getActivityId());
		System.out.println("实例id"+	processInstance.getProcessInstanceId());
    }
	
}

注意:如果启动流程时提示流程定义被终止了( Cannot start process instance. Process definition My process (id = xxx) is suspended)

org.activiti.engine.ActivitiException: Cannot start process instance. Process definition My process (id = myProcess:1:4) is suspended
	at org.activiti.engine.impl.util.ProcessInstanceHelper.createAndStartProcessInstance(ProcessInstanceHelper.java:67)
	at org.activiti.engine.impl.util.ProcessInstanceHelper.createAndStartProcessInstance(ProcessInstanceHelper.java:51)
	at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.createAndStartProcessInstance(StartProcessInstanceCmd.java:109)
	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$1.run(CommandInvoker.java:37)
	at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:78)
	at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:57)
	at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:42)
	at org.activiti.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:48)
	at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:63)
	at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:35)
	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:44)
	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:39)
	at org.activiti.engine.impl.RuntimeServiceImpl.startProcessInstanceByKey(RuntimeServiceImpl.java:

 激活流程定义

package org.wxy.com.activiti;

import java.util.Date;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;

/**
 * Unit test for simple App.
 */
public class AppTest {
	
	//流程实例的启动
	@Test
	public  void testprocessstart(){
		//获取流程引擎
		ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
		
		//流程定义激活即有效
		RepositoryService  repositoryService  = processEngine.getRepositoryService();
		repositoryService.activateProcessDefinitionByKey("myProcess");
		
		//流程定义终止即无效
		//repositoryService.suspendProcessDefinitionByKey("myProcess");
		//创建流程启动对象
		RuntimeService runtimeService = processEngine.getRuntimeService();
		//根据流程定义的key,启动某一个流程实例
		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
		System.out.println("活动id"+	processInstance.getActivityId());
		System.out.println("实例id"+	processInstance.getProcessInstanceId());
    }
	
}

 分析执行流程部署操作涉及到的表(5张表)

act_hi_actinst        显示已经完成的活动实例
act_hi_procinst       显示历史流程实例
act_hi_taskinst       任务实例
act_ru_execution      执行表
act_ru_task            执行中的任务表

在act_hi_actinst 表中 end_time为null表示该环节流程(部门领导审批环节)还未执行,即将要执行的任务

其中在act_ru_task表中显示 当前正将要执行的任务

第四步:查询用户任务

	//流程任务查询
	@Test
	public  void testprocessquery(){
		//获取流程引擎
		 ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
         TaskService taskService = processEngine.getTaskService();
		 List<Task> list = taskService.createTaskQuery().processDefinitionKey("myProcess")
		                            .taskAssignee("zhangsan").list();
		 for(int i=0;i<list.size();i++){
			    Task task = list.get(i);
			    System.out.println("流程定义id:"+	task.getProcessDefinitionId());
			    System.out.println("流程实例id:"+	task.getProcessInstanceId());
				System.out.println("任务id:"+	task.getId());
				System.out.println("任务负责人:"+	task.getAssignee());
				System.out.println("任务名称:"+task.getName());
		 }
    }

注:这里有个问题是在eclipse中没有idea那样可以给某个任务环节分配用户,没找到!!!!!!

第五步:流程处理

	
	    //流程任务处理
		@Test
		public  void testprocesstaskhandler(){
			//获取流程引擎
			 ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
	         TaskService taskService = processEngine.getTaskService();
			 List<Task> list = taskService.createTaskQuery().processDefinitionKey("myProcess")
			                            .taskAssignee("zhangsan").list();
			 for(int i=0;i<list.size();i++){
				    Task task = list.get(i);
				    taskService.complete(task.getId());
			   }
	    }

 任务处理后相关变化的表

act_ru_task   显示正在运行的任务

act_hi_taskinst   显示历史运行的任务
 
act_hi_actinst    显示历史实例

act_ru_execution   正在执行的计划

在act_hi_taskinst  表中显示历史任务实例及将要执行的任务实例(end_time 为null)

在act_hi_actinst中显示流程中已经被执行的任务及将要执行的任务(end_time 为null)

在act_ru_task中显示当前流程中(某个环节)正在进行中的任务

流程删除的细节问题:

1.实际应用中如果流程中某个环节没有执行完,此时要求删除流程中的定义的信息怎么处理?

	    //流程任务处理
			@Test
			public  void testprocesstaskdelete(){
				//获取流程引擎
				 ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
		         RepositoryService repositoryService = processEngine.getRepositoryService();
		         //注意此时总经理审批还未结束
		         repositoryService.deleteDeployment("1");

		    }

直接删除会报错!!!! 

 

 如果强制要停止之后的审批流程怎么办?

	    //流程任务处理
			@Test
			public  void testprocesstaskdelete(){
				//获取流程引擎
				 ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
		         RepositoryService repositoryService = processEngine.getRepositoryService();
		         //注意此时总经理审批还未结束   
                 repositoryService.deleteDeployment("1", true);
		    }

    repositoryService.deleteDeployment("1", true);//参数true代表级联删除,此时会先删除未执行的流程节点,然后就可以删除流程定义信息。

流程实例参考:https://www.cnblogs.com/dalianpai/p/11885139.html

流程激活与终止参考:https://juejin.cn/post/6844904004766400519

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Activiti 是一种开源的工作引擎,用于实现和管理业务流程。封装一个 Activiti 工作引擎的 Demo 可以帮助我们更好地理解和使用这个工具。下面我将介绍如何封装一个 Activiti 工作引擎的 Demo。 首先,我们需要在项目中引入 Activiti 的依赖,可以通过 Maven 或者手动导入 jar 包的方式。接下来,我们可以创建一个基于 Spring Boot 的应用程序。 在 Demo 中,我们需要定义一些基本的流程定义和流程实例。流程定义是一个流程模板,描述了业务流程的结构和步骤;而流程实例是流程定义的一个具体执行过程。 为了创建流程定义,我们需要使用 Activiti 提供的 ProcessEngineConfigurator 类。该类可以帮助我们初始化和配置 Activiti 引擎。在配置文件中,我们可以定义数据库连接信息、创建流程定义的方式以及其他相关配置。 在 Demo 中,我们可以使用 BPMN (Business Process Model and Notation)来定义流程模型。BPMN 是一种标准化的图形化表示语言,可以帮助我们更好地理解和管理业务流程。我们可以使用 Activiti 提供的设计器来创建和编辑 BPMN 文件。 接下来,我们需要实现流程定义的部署和启动。部署是将流程定义存储在 Activiti 引擎中的过程,启动是根据定义的流程模板创建一个流程实例。 我们可以使用 Activiti 提供的 RepositoryService 来进行部署操作。通过该服务,我们可以将 BPMN 文件部署到引擎中,并且可以查询已经部署的流程定义。 通过调用 RuntimeService 的 startProcessInstanceByKey 方法,我们可以根据流程定义的 key(在部署时定义的)启动一个流程实例。 在流程实例启动后,我们可以使用 TaskService 进行任务分配和处理。可以通过查询特定用户的待办任务和已完成任务,完成任务的提交操作。 最后,我们可以使用 HistoryService 来查询已完成的流程实例和任务的历史记录。这可以帮助我们进行流程性能和效率的评估。 封装一个 Activiti 工作引擎的 Demo,可以帮助我们更好地了解和使用这个工作引擎。通过实际的示例,我们可以学习如何创建流程定义、部署和启动流程实例、处理任务以及查询历史记录等操作。这将帮助我们更好地管理和优化业务流程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值