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.在如下面板中:
activiti7入门体验(2)-编程知识网
2)在如下Install界面板中,点击Add按钮:
activiti7入门体验(2)-编程知识网
配置新装插件的地址和名称
3)然后填入下 列字段
Name: Activiti BPMN 2.0 designer
Location: http://activit.org/designer/ update/
activiti7入门体验(2)-编程知识网
4)回到Install界面,在面板正中列表中把所有展示出来的项目都勾.上:

activiti7入门体验(2)-编程知识网
5)点击复选框
在Detail部分记得选中"Contact all updates sites…" ,因为沱会检查所有当前安装所需
要的插件并可以被Eclipse’下载.
6)安装完以后, 点击新建工程new->0ther…打开面板,如果看到下图内容:说明就安装成功了
activiti7入门体验(2)-编程知识网

补充说明

打开菜单Windows->P references-> Activiti-> Save’下流程图片的生成方式:
activiti7入门体验(2)-编程知识网
虽然流程引擎在单独部署bpmn文件时会自动生成图片,但在实际开发过程中,自动生成的图
片会导致和BPMN中的坐标有出入,在实际项目中展示流程当前位置图会有问题。所在完成以上配置后,会由我们自己来管理流程图片。在发布流程时把流程规则文件和流程图片- -起上传就行了。

Activiti Designer流程设计器(idea安装方式)

在IDEA的File菜单中找到子菜单"ettings",后面我们再选择左侧的“plugins”菜单,如下图所示:
activiti7入门体验(2)-编程知识网
此时我们就可以搜索到actiBPM插件,它就是Activiti Designer的IDEA版本。.
安装好后,页面如下:
activiti7入门体验(2)-编程知识网

创建mysql数据库

我使用的是mysql数据库。
创建mysql数据库activiti (名字任意):

  1. 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.xsdhttp://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsdhttp://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名称

  1. createProcessEngi neConfi gur ati onFr omResource CString resource, String beanName)

此时我们查看数据库,创建了25 张表,结果如下:
activiti7入门体验(2)-编程知识网

流程定义

Palette (画板)

在eclipse或idea中安装activiti-designer插件即可使用,画板中包括以下结点:
Connection-连接
Event–事件
Task–任务
Gateway–网关
Container-容器
Boundaryevent-边界事件
Intermediate event- -中间事件
流程图设计完毕保存生成.bpmn文件。

新建流程(IDEA工具)

首先选中存放图形的目录(本次我们选择resources 下的bpmn目录),点击菜单: New-BpmnFile,
activiti7入门体验(2)-编程知识网
activiti7入门体验(2)-编程知识网
起完名字holiday后(默认扩展名为bpmn),就可以看到进入了流程设计页面,如图所示:

新建流程(eclipse工具)

首先选中存放图形的目录(本次我们选择resources’ 下的bpmn目录),
File-New-Other 菜单,打开如下窗口。
activiti7入门体验(2)-编程知识网
左侧区域是绘图区,右侧区域是palette画板区域鼠标先点击画板的元素即可在左侧绘图。

activiti7入门体验(2)-编程知识网

流程绘制

activiti7入门体验(2)-编程知识网
activiti7入门体验(2)-编程知识网
activiti7入门体验(2)-编程知识网

指定流程的key

流程定义key即流程定义的标识,在eclipse中通过properties视图查看流程的key ,
建议:相同的业务流程,流程定义的key名字定义一一样,比如,如果需要创建新的业务流程,请假流程则使用新的key.
activiti7入门体验(2)-编程知识网

指定任务负责人

在properties视图指定每个任务结点的负责人,比如下边是填写请假单的负责人为zhangsan
activiti7入门体验(2)-编程知识网

流程部署定义

部署流程定义就是要将上边绘制的图形即流程定义( .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.输出任务的idSystem.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.执行删除流程定义  参数代表流程部署的idrepositoryService.deleteDeployment("1");

说明:

  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.通过流程定义信息,得到部署IDString 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.得到HistoryServiceHistoryService 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 感谢此网站让我学到了很多知识