- Activiti7的进阶使用
- 1.idea安装插件
- 2.Maven
- 3.配置文件Xml(最好默认名称)
- activiti.cfg.xml
- log4j.properties
- 4.创建数据库
- 4.1 创建新的空数据库
- 4.2 建表
- 4.2.1 创建流程图
- 4.2.2 创建表的两种方式
- 单个流程的创建
- 通过ZIP压缩包一次性创建多个流程
- 4.3 Service总览
- 5.简单测试使用
- 5.1 启动流程实列(根据Key值来启动)
- 5.2 任务查询 (根据流程定义的Key和负责人来进行查询)
- 5.3 任务的完成
- 5.3.1 执行第一次
- 5.3.2 执行第二次
1.idea安装插件
1.1 Activiti BPMN visualizer
1.2 测试是否能正常使用
1.3 右键选择此BPMN.xml文件
1.4 成功
3.配置文件Xml(最好默认名称)17 17 7.1.0.M6 org.activiti activiti-engine ${activiti.version} org.activiti activiti-spring ${activiti.version} org.activiti activiti-bpmn-model ${activiti.version} org.activiti activiti-bpmn-converter ${activiti.version} org.activiti activiti-json-converter ${activiti.version} org.activiti activiti-bpmn-layout ${activiti.version} org.activiti.cloud activiti-cloud-services-api 7.0.0.Beta1 mysql mysql-connector-java 8.0.29 org.mybatis mybatis 3.5.10 commons-dbcp commons-dbcp 1.4 junit junit 4.13.2 log4j log4j 1.2.17 org.slf4j slf4j-api 1.7.36 org.slf4j slf4j-log4j12 1.7.36 commons-io commons-io 2.11.0
目录结构
log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
#日志文件位置
log4j.appender.LOGFILE.File=D:\Test\java\Test1\activiti7\src\main\resources\log\activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m
4.创建数据库
4.1 创建新的空数据库
根据 activiti.cfg.xml 文件中所连接的数据库名字创建一个新的空数据库
此处流程图名会在数据库的 act-re-procdef 表中作为唯一Key标识
- 右键选择图标
- 选中图标修修改信息,如下
修改Name等信息
- 点击图标,拖动右上角的箭头,将他们之间的关系连接起来
- 右键,save to PNG,将png文件保存下来方便日后查看
@Test
public void testDeployment() {
//1.创建 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.使用RepositoryService进行部署,将bpmn文件和生成的png文件路径放入其中
Deployment deploy = repositoryService.createDeployment().name("出差申请流程").addClasspathResource("bpmn/evection.bpmn20.xml").addClasspathResource("bpmn/evection.png").deploy();
//4.输出部署信息
System.out.println("流程部署ID=" + deploy.getId());
System.out.println("流程部署名字=" + deploy.getName());
}
通过ZIP压缩包一次性创建多个流程
目录结构
@Test
public void deployProcessByZip() {
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//流程部署
//读取资源包文件构造成inputStream
InputStream inputStream = this.getClass()
.getClassLoader()
.getResourceAsStream("bpmn/evection.zip");
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
Deployment deploy = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.deploy();
System.out.println("流程部署ID" + deploy.getId());
System.out.println("流程部署名称" + deploy.getName());
}
可以看到 act-re-procdef 表中已经有了两个流程
ps1: 上面的是默认创建方式,activiti.cfg.xml文件名及路径固定,且activiti.cfg.xml文件中有 processEngineConfiguration的配置
.
ps2: 一般创建方式如下
//先构建ProcessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();
4.3 Service总览
部署操作表
act-re-deployment 部署表
act-re-procdef 流程定义表
act-ge-bytearray 资源表
| service名称 | service作用 |
|---|---|
| RepositoryService | activiti的资源管理类 |
| RuntimeService | activiti的流程运行管理类 |
| TaskService | activiti的任务管理类 |
| HistoryService | activiti的历史管理类 |
| ManagerService | activiti的引擎管理类 |
5.简单测试使用 5.1 启动流程实列(根据Key值来启动)简单介绍:
.
RepositoryService是activiti的资源管理类,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要使用此service将流程定义文件的内容部署到计算机。
除了部署流程定义以外还可以:查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。
暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。
.
RuntimeServiceActiviti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息
.
TaskServiceActiviti的任务管理类。可以从这个类中获取任务的信息。
.
HistoryServiceActiviti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者,
完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。
.
ManagementServiceActiviti的引擎管理类,提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于
Activiti 系统的日常维护。
核心
ProcessInstance instance = runtimeService.startProcessInstanceByKey("Test2");
@Test
public void testStartProcess() {
//1.创建 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.获取runTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.根据流程定义 Key 的启动流程
ProcessInstance instance = runtimeService.startProcessInstanceByKey("Test2");
//4.输出内容
System.out.println("流程定义ID=" + instance.getProcessDefinitionId());
System.out.println("流程实列ID=" + instance.getId());
System.out.println("当前活动的ID=" + instance.getActivityId());
}
5.2 任务查询 (根据流程定义的Key和负责人来进行查询)
核心 (taskAssignee是画图的时候Assignee所填写的内容,正常为负责人名称)
taskService.createTaskQuery() .processDefinitionKey("Test2") .taskAssignee("第一个节点") .list();
@Test
public void testFindPersonalTaskList() {
//1、获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取taskService
TaskService taskService = processEngine.getTaskService();
//3、根据流程key 和 任务的负责人 查询任务
List list = taskService.createTaskQuery()
.processDefinitionKey("Test2")
.taskAssignee("第一个节点")
.list();
//4、输出
for (Task task : list) {
System.out.println("流程定义ID=" + task.getProcessInstanceId());
System.out.println("任务ID=" + task.getId());
System.out.println("任务负责人=" + task.getAssignee());
System.out.println("任务名称=" + task.getName());
}
}
5.3 任务的完成
核心 (使用TaskService,用任务ID来完成,任务id见上方 task.getId() )
taskService.complete("2505");
流程图
表 act_ru_task
任务第一步执行之前(启动流程实例)
@Test
public void completTask() {
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取操作任务的服务 TaskService
TaskService taskService = processEngine.getTaskService();
//完成任务,参数:任务id,完成 >第一个节点< 的任务
taskService.complete("2505");
}
任务第一步执行之后,第二步执行之前
通过任务查询 createTaskQuery 获取 ( 任务查询 createTaskQuery)
@Test
public void completTask() {
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取操作任务的服务 TaskService
TaskService taskService = processEngine.getTaskService();
//获取 Test2 - 第一个节点 对应的任务
Task task = taskService.createTaskQuery()
.processDefinitionKey("Test2")
.taskAssignee("第二个节点")
.singleResult();
//完成 >第二个节点< 的任务
taskService.complete(task.getId());
}
任务第二步执行之后,因为流程结束,所以此表删除这个任务实例



