activiti7入门体验(2)
在大家学习了activiti7基本学习过后想必都对activiti7有一定的理解了,接下来我就给大伙讲述一下activiti7基本的功能和环境的搭建
开发环境
java环境
jdk1.8
数据库环境
mysql5.5或以上都可以哦!
开发工具
Mysql客户端连接工具,Sqlyog 或其它
文本编辑器EditPlus或其它
Java开发工具: IDEA或Eclipse工具
注意: activiti 的流程定义工具插件可以安装在IDEA下,也可以安装在Eclipse工具下。
Activiti环境
Activiti7.0.0.Betal
默认支持spring5
下载activiti7
Activiti下载地址: htp://activiti org/download.html
`<dependencyManagement>
<dependencies>
< dependency>
<group Id>org. act iviti </groupId>
<artif actId>activiti -dependencies</ arti f actId>
<version>7. 0.0.Beta1< /vers ion>
< scope> import</s cope>
<type>pom</ type>
< /dependency>
< /dependencies>
</ dependencyManagement>`
1) Database :
activiti运行需要有数据库的支持,支持的数据库有: h2, mysq1, oracle, postgres, mssql, db2
等,该目录存放activiti的建表脚本。
2) Docs
Activiti的帮助文档。
3) Wars
官方自带的示例工程。
Activiti Designer流程设计器Eclispe工具下插件安装方式(Eclipse工具)
打开Help -> Install New Software.在如下面板中:
2)在如下Install界面板中,点击Add按钮:
配置新装插件的地址和名称
3)然后填入下 列字段
Name: Activiti BPMN 2.0 designer
Location: http://activit.org/designer/ update/
4)回到Install界面,在面板正中列表中把所有展示出来的项目都勾.上:
5)点击复选框
在Detail部分记得选中"Contact all updates sites…" ,因为沱会检查所有当前安装所需
要的插件并可以被Eclipse’下载.
6)安装完以后, 点击新建工程new->0ther…打开面板,如果看到下图内容:说明就安装成功了
补充说明
打开菜单Windows->P references-> Activiti-> Save’下流程图片的生成方式:
虽然流程引擎在单独部署bpmn文件时会自动生成图片,但在实际开发过程中,自动生成的图
片会导致和BPMN中的坐标有出入,在实际项目中展示流程当前位置图会有问题。所在完成以上配置后,会由我们自己来管理流程图片。在发布流程时把流程规则文件和流程图片- -起上传就行了。
Activiti Designer流程设计器(idea安装方式)
在IDEA的File菜单中找到子菜单"ettings",后面我们再选择左侧的“plugins”菜单,如下图所示:
此时我们就可以搜索到actiBPM插件,它就是Activiti Designer的IDEA版本。.
安装好后,页面如下:
创建mysql数据库
我使用的是mysql数据库。
创建mysql数据库activiti (名字任意):
- CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;
创建表方式
通过运行java程序创建表。
创建java工程
使用eclipse 或idea创建maven的java工程。
加入maven依赖的坐标(jar 包)
首先需要在java工程中加入ProcessEngine所需要的jar 包,包括:
1)activiti-engine- 7.0.0.betal jar
2) activiti 依赖的jar包: mybatis、 alf4j、 log4j 等
3) activiti 依赖的spring包
4)数据库驱动
5)第三方数据连接池dbq
6)单 元测试Junit-4.12jar
我们使用maven来实现项目的构建,所以应当导入这些jar所对应的坐标到pom.xml文件中。
<properties>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
</properties>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.activiti.cloud</groupId>
<artifactId>activiti-cloud-services-api</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
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\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.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\n
log4j.properties
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/itcast0711activiti" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="maxActive" value="3" />
<property name="maxIdle" value="1" />
</bean>
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="dataSource" ref="dataSource"></property>
<property name="databaseSchemaUpdate" value="true"/>
</bean>
<!--<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/itcast0711activiti"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="root"/>
<property name="databaseSchemaUpdate" value="true"/>
</bean>-->
</beans>
关于processEngineConfiguration中的da tabaseSchemaUpdate参数,通过此参数设计activiti数据表的处理策略,参数如下:
false (默认):检查数据库表的版本和依赖库的版本,如果版 本不匹配就抛出异常。
true:构建流程引擎时,执行检查,如果需要就执行更新。如果表不存在, 就创建。
create-drop:构建流程引擎时创建数据库表,关闭流程 引擎时删除这些表。
drop-create:先删除表再创建表。
create:构建流程引擎时创建数据库表,关闭流程 引擎时不删除这些表。
编写程序
创建ProcessEngineConfiguration,通过ProcessEngineConfiguration创建ProcessEngine,在创建ProcessEngine时会自动创建数据库。
//创建ProcessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource ("activiti. cfg. xml")
// 通过ProcessEngineConfigurat ion创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine =configuration.buildProcessEngine();
System.out .println( processEngine);
说明:
1、运行以上程序段即可完成activiti数据库创建,通过改变activiti.cfg. xml中databaseSchemaUpdate参数的值执行不同的数据表处理策略。
2、上边的方法createProcessEngineConfigurationFromResource 在执行时在activiti. cfg. xmL中找固定的名称processEngineConfiguration也可以使用重载方法调用,这时可以不用限定processEngineConfiguration名称
- createProcessEngi neConfi gur ati onFr omResource CString resource, String beanName)
此时我们查看数据库,创建了25 张表,结果如下:
流程定义
Palette (画板)
在eclipse或idea中安装activiti-designer插件即可使用,画板中包括以下结点:
Connection-连接
Event–事件
Task–任务
Gateway–网关
Container-容器
Boundaryevent-边界事件
Intermediate event- -中间事件
流程图设计完毕保存生成.bpmn文件。
新建流程(IDEA工具)
首先选中存放图形的目录(本次我们选择resources 下的bpmn目录),点击菜单: New-BpmnFile,
起完名字holiday后(默认扩展名为bpmn),就可以看到进入了流程设计页面,如图所示:
新建流程(eclipse工具)
首先选中存放图形的目录(本次我们选择resources’ 下的bpmn目录),
File-New-Other 菜单,打开如下窗口。
左侧区域是绘图区,右侧区域是palette画板区域鼠标先点击画板的元素即可在左侧绘图。
流程绘制
指定流程的key
流程定义key即流程定义的标识,在eclipse中通过properties视图查看流程的key ,
建议:相同的业务流程,流程定义的key名字定义一一样,比如,如果需要创建新的业务流程,请假流程则使用新的key.
指定任务负责人
在properties视图指定每个任务结点的负责人,比如下边是填写请假单的负责人为zhangsan
流程部署定义
部署流程定义就是要将上边绘制的图形即流程定义( .bpmn)部署在工作流程引擎activiti 中,方法
如下:使用ProcessEngine创建RepositoryService,代码如下:
//获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//部署对象
Deployment deployment = repositoryService . createDeployment()
.addClasspathResource( "diagram/myholiday . bpmn")// bpmn 文件
.addClasspathResource("diagram/myholiday. png")// 图片文件
.name("请假申请流程"). deploy();
System. out . println( "流程部署id:" + deployment . getId());
System . out. println( "流程部署名称:" + deployment . getName());
执行此操作后activiti 会将.上边代码中指定的bpm文件和图片文件保存在activiti数据库。
启动一个流程实例
流程定义部署在activiti后就可以通过工作流管理业务流程了,也就是说上边部署的请假申请流程可以使用了。
针对该流程,启动一个流程表示发起–个新的请假申请单,这就相当于java类与java对象的关
系,类定义好后需要new创建- - 个对象使用,当然可以new多个对象。对于请假申请流程,张三发
起一个请假申请单需要启动-个流程实例,请假申请单发起–个请假单也需要启动-一个流程实例。
代码加下。
//启动一个流程实例
@Test
public void startProcessInstance() {
//获取RunTimeService
=
RuntimeService runtimeServiceprocessEngine.getRuntimeService();
//根据流程定义key启动流程
ProcessInstance processInstance = runtimeService
. startProcessInstanceByKey( "myholiday");
System. out . print1n("流程定义id+processInstance . getProcessDefinitionId());
System. out . println( "流程实例id: " + processInstance. getId());
System. out . println("当前活动Id+processInstance. getActivityId());
任务查询
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到TaskService对象
TaskService taskService = processEngine.getTaskService();
//3.根据流程定义的key,负责人assignee来实现当前用户的任务列表查询
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey("myholiday")
.taskAssignee("zhangsan")
.list();
//4.任务列表的展示
for(Task task :taskList){
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("任务ID:"+task.getId());
System.out.println("任务负责人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
}
任务处理
任务负责人查询待办任务,选择任务进行处理,完成任务。
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到TaskService对象
TaskService taskService = processEngine.getTaskService();
//3.查询当前用户的任务
Task task = taskService.createTaskQuery()
.processDefinitionKey("myholiday")
.taskAssignee("zhangsan")
.singleResult();
//4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
taskService.complete(task.getId());
//5.输出任务的id
System.out.println(task.getId());
流程定义查询
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.创建RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.得到ProcessDefinitionQuery对象,可以认为它就是一个查询器
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//4.设置条件,并查询出当前的所有流程定义 查询条件:流程定义的key=holiday
//orderByProcessDefinitionVersion() 设置排序方式,根据流程定义的版本号进行排序
List<ProcessDefinition> list = processDefinitionQuery.processDefinitionKey("holiday")
.orderByProcessDefinitionVersion()
.desc().list();
//5.输出流程定义信息
for(ProcessDefinition processDefinition :list){
System.out.println("流程定义ID:"+processDefinition.getId());
System.out.println("流程定义名称:"+processDefinition.getName());
System.out.println("流程定义的Key:"+processDefinition.getKey());
System.out.println("流程定义的版本号:"+processDefinition.getVersion());
System.out.println("流程部署的ID:"+processDefinition.getDeploymentId());
}
流程定义删除
删除已经部署成功的流程定义。
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.创建RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.执行删除流程定义 参数代表流程部署的id
repositoryService.deleteDeployment("1");
说明:
- 使用repositoryService删除流程定义
2)如果该流程定义下没有正在运行的流程,则可以用普通删除。
3)如果该流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程及相关
记录全部删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使
用。
流程定义资源查询
通过流程定义对象获取流程定义资源,获取bpmn和png。
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.得到查询器:ProcessDefinitionQuery对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//4.设置查询条件
processDefinitionQuery.processDefinitionKey("holiday");//参数是流程定义的key
//5.执行查询操作,查询出想要的流程定义
ProcessDefinition processDefinition = processDefinitionQuery.singleResult();
//6.通过流程定义信息,得到部署ID
String deploymentId = processDefinition.getDeploymentId();
//7.通过repositoryService的方法,实现读取图片信息及bpmn文件信息(输入流)
//getResourceAsStream()方法的参数说明:第一个参数部署id,第二个参数代表资源名称
//processDefinition.getDiagramResourceName() 代表获取png图片资源的名称
//processDefinition.getResourceName()代表获取bpmn文件的名称
InputStream pngIs = repositoryService
.getResourceAsStream(deploymentId,processDefinition.getDiagramResourceName());
InputStream bpmnIs = repositoryService
.getResourceAsStream(deploymentId,processDefinition.getResourceName());
//8.构建出OutputStream流
OutputStream pngOs =
new FileOutputStream("G:\\Activiti7开发计划\\Activiti7-day03\\资料\\"+processDefinition.getDiagramResourceName());
OutputStream bpmnOs =
new FileOutputStream("G:\\Activiti7开发计划\\Activiti7-day03\\资料\\"+processDefinition.getResourceName());
//9.输入流,输出流的转换 commons-io-xx.jar中的方法
IOUtils.copy(pngIs,pngOs);
IOUtils.copy(bpmnIs,bpmnOs);
//10.关闭流
pngOs.close();
bpmnOs.close();
pngIs.close();
bpmnIs.close();
流程定义资源查询
即使流程定义已经删除了,流程执行的历史信息通过前面的分析,依然保存在activiti 的act hi_ *相
关的表中。所以我们还是可以查询流程执行的历史信息,可以通过HistoryService 来查看相关的历史
记录。
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到HistoryService
HistoryService historyService = processEngine.getHistoryService();
//3.得到HistoricActivitiInstanceQuery对象
HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
historicActivityInstanceQuery.processInstanceId("2501");//设置流程实例的id
//4.执行查询
List<HistoricActivityInstance> list = historicActivityInstanceQuery
.orderByHistoricActivityInstanceStartTime().asc().list();//排序StartTime
//5.遍历查询结果
for (HistoricActivityInstance instance :list){
System.out.println(instance.getActivityId());
System.out.println(instance.getActivityName());
System.out.println(instance.getProcessDefinitionId());
System.out.println(instance.getProcessInstanceId());
System.out.println("=============================");
}
本文参考了黑马程序员网站的资料www.itheima.com 感谢此网站让我学到了很多知识