Activiti是一个开源的工做流引擎,它实现了BPMN 2.0规范,能够发布设计好的流程定义,并经过api进行流程调度。java
Activiti 做为一个听从 Apache 许可的工做流和业务流程管理开源平台,其核心是基于 Java 的超快速、超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更增强调面向业务人员。mysql
Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。经过使用这些服务,开发人员可以构建出功能丰富、轻便且高效的 BPM 应用程序。git
如今至少要知道有这些对象和接口。并结合Activiti Api这一章节来看,你就会对部署流程、启动流程、执行任务等操做有一个基本的概念。以后编写一个简单的单元测试,主要为了测试activiti.cfg.xml配置的是否正确,流程是否能够被部署便可。github
至于与Spring的集成,必定要熟悉基于Spring配置Activiti,以及事务的处理。web
activiti工做流历史版本下载,更改版本号后在浏览器地址栏回车便可spring
https://github.com/Activiti/Activiti/releases/download/activiti-5.16.3/activiti-5.16.3.zipsql
下载后解压获得:数据库
初始化数据库(本文采用的mysql数据库)apache
\wars\activiti-explorer.war解压到tomcat的webapps下,并修改\activiti-explorer\WEB-INF\classes中的db.properties:segmentfault
#db=h2 #jdbc.driver=org.h2.Driver #jdbc.url=jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000 #jdbc.username=sa #jdbc.password= db=mysql jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1/activititest?useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=123456
访问首页,打开浏览器输入http://localhost:8080/activiti-explore,使用用户kermit,密码kermit登陆
1.安装IDEA中编辑Activiti流程的插件actiBPM,安装完成后重启IDEA
2.新建一个maven工程,pom.xml文件内容为:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xuan</groupId> <artifactId>testactiviti</artifactId> <version>1.0-SNAPSHOT</version> <name>testactiviti</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <!--<scope>test</scope>--> </dependency> <!--- Activiti依赖导入 --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>5.22.0</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>5.22.0</version> <exclusions> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>jackson-core-asl</artifactId> <groupId>org.codehaus.jackson</groupId> </exclusion> <exclusion> <artifactId>commons-lang3</artifactId> <groupId>org.apache.commons</groupId> </exclusion> <exclusion> <artifactId>commons-lang3</artifactId> <groupId>org.apache.commons</groupId> </exclusion> </exclusions> </dependency> <!--MySQL 驱动包,若是是其余库的话须要换驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> </dependencies> </project>
建立资源文件夹resource,并把目录设置为Test Resources Root
目录结构为
在resource目录中新建activiti.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/testactiviti?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8"></property> <property name="jdbcUsername" value="root"></property> <property name="jdbcPassword" value="123456"></property> <property name="databaseSchemaUpdate" value="true"></property> </bean> </beans>
在resources下面新建一个WorkTest.bpmn文件:
新建以后页面会变成以下图所示这样,中间是画布,右边是一些元素,左边是每一个元素的一些详细信息,直接拖拽右边的元素就能够画流程了。
画完流程图以后能够更改整个流程的name和元素的name,assignee,
可是画图以后,没有链接图标怎么办呢
把鼠标放在开头的那个图标上,此时光标的形状改变了。 拖到另外一个上面,链接成功了。
怎么链接成功的呢? 把鼠标放到图标的正中心,而后会看到光标变成了“扇子类型”的样子(黑白相间)。只要看到变成这个样子,就能够拖动到另外一个图标中,进行链接了
我这里画的一个很简单的流程图,只用到了startEvent、endEvent和userTask。个人流程是作的订单的审批。如图:
画完图后,可是并无生成png图片,这个时候重命名刚才建立的文件,把后缀改为xml,而后右键
这个时候发现显示的时候有乱码:
解决方法:
找到idea安装目录bin目录下以下图所示两个文件,用编辑器打开,在文件末尾添加 -Dfile.encoding=UTF-8 ,而后重启idea,再打开流程图就会发现中文已经能够正常显示了。
解决问题后,把xml文件从新改为bpmn格式,和png图片一块儿压缩成zip包进行部署。
Activiti提供使用代码或者配置文件的方式来配置数据库的信息,新建MyActiviti.java来生成数据库信息:
public class MyActiviti { @Test public void creatTable() { ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine(); System.out.println("processEngine:"+ processEngine); } @Test public void creatTable2() { ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); //链接数据库配置 processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver"); processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8"); processEngineConfiguration.setJdbcUsername("root"); processEngineConfiguration.setJdbcPassword("123456"); /** public static final String DB_SCHEMA_UPDATE_FALSE = "false";//不能自动建立表,须要表存在 public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";//先删除表再建立表 public static final String DB_SCHEMA_UPDATE_TRUE = "true";//若是表不存在,自动建立表 */ processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP); //工做流的核心对象,ProcessEngine对象 ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine(); System.out.println("processEngine:"+ processEngine); } }
运行这个类的creatTable或creatTable2以后,自动帮咱们把对应的数据库表建立起来,有些说23-25张表都是有可能的,我这里是生成了25张表。
全部的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。
每一个表和字段的具体含义能够参考:http://www.javashuo.com/article/p-bhlvlsex-hy.html
建表成功以后就能够开始部署流程了,部署以后就能够在act_re_procdef表中看到对相应的流程信息.
@Test public void deploy() { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); DeploymentBuilder builder = repositoryService.createDeployment();//建立一个部署的构建器 builder.addClasspathResource("WorkTest.bpmn");//从类路径中添加资源,一次只能添加一个资源 builder.name("订单审批"); builder.category("办公类别"); Deployment deploy = builder.deploy(); System.out.println("部署的id" + deploy.getId()); System.out.println("部署的名称" + deploy.getName()); }
//查询流程 @Test public void queryProcdef() { RepositoryService repositoryService = processEngine.getRepositoryService(); //建立查询对象 ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); //添加查询条件 //query.processDefinitionKey("myProcess_2");//经过key获取 // .processDefinitionName("My process")//经过name获取 query.orderByProcessDefinitionId().asc();//根据ID排序 //执行查询获取流程定义明细 List<ProcessDefinition> pds = query.list(); for (ProcessDefinition pd : pds) { System.out.println("ID:" + pd.getId() + ",NAME:" + pd.getName() + ",KEY:" + pd.getKey() + ",VERSION:" + pd.getVersion() + ",RESOURCE_NAME:" + pd.getResourceName() + ",DGRM_RESOURCE_NAME:" + pd.getDiagramResourceName()); } }
@Test public void startProcess() { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //指定执行咱们刚才部署的工做流程,就是bomn文件定义的流程ID或者名称 String processDefiKey = "myProcess_1"; //取运行时服务 RuntimeService runtimeService = processEngine.getRuntimeService(); //取得流程实例 ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey);//经过流程定义的key 来执行流程 System.out.println("流程实例id:" + pi.getId());//流程实例id System.out.println("流程定义id:" + pi.getProcessDefinitionId());//输出流程定义的id }
启动流程以后就会有相应的任务产生,存在act_ru_task表中,能够查看任务节点
@Test public void queryTask() { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = processEngine.getTaskService(); //processInstanceId,就是act_ru_task的PROC_INST_ID_ String processInstanceId = "12501"; List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).list(); //首次运行的时候这个没有输出,由于第一次运行的时候扫描act_ru_task的表里面是空的,但第一次运行完成以后里面会添加一条记录,以后每次运行里面都会添加一条记录 for (Task task : tasks) { System.out.println("taskId:" + task.getId() + ",taskName:" + task.getName() + ",assignee:" + task.getAssignee() + ",createTime:" + task.getCreateTime()); } }
也能够根据其它各类条件进行查询
//查询流程定义明细 @Test public void queryProcdef() { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); //建立查询对象 ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); //添加查询条件 query.processDefinitionKey("myProcess_1");//经过key获取 // .processDefinitionName("My process")//经过name获取 // .orderByProcessDefinitionId()//根据ID排序 //执行查询获取流程定义明细 List<ProcessDefinition> pds = query.list(); for (ProcessDefinition pd : pds) { System.out.println("ID:" + pd.getId() + ",NAME:" + pd.getName() + ",KEY:" + pd.getKey() + ",VERSION:" + pd.getVersion() + ",RESOURCE_NAME:" + pd.getResourceName() + ",DGRM_RESOURCE_NAME:" + pd.getDiagramResourceName()); } }
//完成任务 @Test public void compileTask(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); String taskId="12504";//任务id,act_ru_task的ID_ processEngine.getTaskService().complete(taskId); System.out.println("当前任务执行完毕"); }
其它还有删除流程等各类操做,能够参考http://www.javashuo.com/article/p-pfhgbmjv-cv.html