一,Activiti简介。
Activiti项目是一项新的基于Apache许可的开源工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。
二,BPMN2.0规范。
BPMN(Business ProcessModel and Notation)--业务流程模型与符号。
BPMN是一套流程建模的标准,主要目标是被所有业务用户容易理解的符号,支持从创建流程轮廓的业务分析到这些流程的最终实现,知道最终用户的管理监控。
通俗一点其实就是一套规范,画流程模型的规范。
流程模型包括:流程图、协作图、编排图、会话图。
三,demo(也可以当做Activiti控制台)
1,学习网站:http://www.mossle.com/docs/activiti/index.html#demo.setup.one.minute.version;
2,从Activiti网站下载ActivitiExplorer的WAR文件;点击这里可以下载
3,准备运行环境:jdk 1.6+ ,tomcat 6.0+;
4,将上面的war包放到tomcatwebapps文件夹下面;
5,启动tomcat,访问:http://localhost:8080/activiti-explorer,使用kermit/kermit登录;
6,登录后可以测试创建任务,提交申请,完成审批等操作。
7,点击流程设计工作区,可以自定义流程。
四,本地项目使用(简单测试)
1,这里以maven web 项目为基础,开发工具使用eclipse,要求jdk 1.6及以上版本。
2,如果不想使用上面提供的管理器定义流程图,也可以在自己本地下载eclipse插件:
Activiti BPMN 2.0 designer。
下载步骤:
打开eclipse,找到工具栏Help,选择Install New SoftWare,点击Add输入:
Activiti BPMN 2.0 designer
http://activiti.org/designer/update/
按照默认勾选,直到安装完成,重启eclipse生效。
3,新建maven web项目,添加依赖包,项目有使用Spring + Spring mvc 框架,这里省略配置。
org.activiti
activiti-engine
5.21.0
org.activiti
activiti-spring
5.21.0
org.slf4j
slf4j-api
1.7.10
ch.qos.logback
logback-classic
1.1.2
ch.qos.logback
logback-core
1.1.2
junit
junit
4.12
mysql
mysql-connector-java
5.1.38
4,设计流程图。
4.1,在项目中新建一个*.bpmn,如my-process.bpmn,上面已经安装了插件。
4.2,完成一个简单的流程图,这里新建了两个用户审批节点。
4.3,保存后会自动生成xml文档,切换查看方式为xml,可以看到源文件:
5,流程设计完成后,主要是在项目中如何集成使用。
5.1,添加配置文件,默认文件名activiti.cfg.xml,这里使用Spring管理,可以任意命名,需要在wen.xml中指定classpath。
配置关系图:
配置示例:
上面配置中的activiti api接口也可以不配置,在项目中使用就使用processEngine调用上面配置的factory-method方法获取。
5.2,启动项目,查看日志,activiti会自动创建所需要的数据表。
2017-07-20 14:11:06.017 [localhost-startStop-1] DEBUG o.a.e.i.interceptor.LogInterceptor - --- starting SchemaOperationsProcessEngineBuild --------------------------------------------------------
2017-07-20 14:11:06.023 [localhost-startStop-1] DEBUG o.a.s.SpringTransactionInterceptor - Running command with propagation NOT_SUPPORTED
2017-07-20 14:11:06.078 [localhost-startStop-1] DEBUG o.a.i.t.managed.ManagedTransaction - Opening JDBC Connection
2017-07-20 14:11:06.111 [localhost-startStop-1] DEBUG o.s.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
2017-07-20 14:11:06.675 [localhost-startStop-1] DEBUG o.s.jdbc.datasource.DataSourceUtils - Registering transaction synchronization for JDBC Connection
2017-07-20 14:11:06.690 [localhost-startStop-1] INFO o.a.engine.impl.db.DbSqlSession - performing create on engine with resource org/activiti/db/create/activiti.mysql.create.engine.sql
2017-07-20 14:11:06.690 [localhost-startStop-1] INFO o.a.engine.impl.db.DbSqlSession - Found MySQL: majorVersion=5 minorVersion=7
2017-07-20 14:11:06.692 [localhost-startStop-1] DEBUG o.a.engine.impl.db.DbSqlSession - SQL: create table ACT_GE_PROPERTY (
NAME_ varchar(64),
VALUE_ varchar(300),
REV_ integer,
primary key (NAME_)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin
2017-07-20 14:11:07.229 [localhost-startStop-1] DEBUG o.a.engine.impl.db.DbSqlSession - SQL: insert into ACT_GE_PROPERTY
values ('schema.version', '5.18.0.1', 1)
2017-07-20 14:11:07.274 [localhost-startStop-1] DEBUG o.a.engine.impl.db.DbSqlSession - SQL: insert into ACT_GE_PROPERTY
values ('schema.history', 'create(5.18.0.1)', 1)
2017-07-20 14:11:07.318 [localhost-startStop-1] DEBUG o.a.engine.impl.db.DbSqlSession - SQL: insert into ACT_GE_PROPERTY
values ('next.dbid', '1', 1)
2017-07-20 14:11:07.407 [localhost-startStop-1] DEBUG o.a.engine.impl.db.DbSqlSession - SQL: create table ACT_GE_BYTEARRAY (
ID_ varchar(64),
REV_ integer,
NAME_ varchar(255),
DEPLOYMENT_ID_ varchar(64),
BYTES_ LONGBLOB,
GENERATED_ TINYINT,
primary key (ID_)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin
2017-07-20 14:11:08.383 [localhost-startStop-1] DEBUG o.a.engine.impl.db.DbSqlSession - SQL: create table ACT_RE_DEPLOYMENT (
ID_ varchar(64),
NAME_ varchar(255),
CATEGORY_ varchar(255),
TENANT_ID_ varchar(255) default '',
DEPLOY_TIME_ timestamp(3),
primary key (ID_)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin
2017-07-20 14:11:09.338 [localhost-startStop-1] DEBUG o.a.engine.impl.db.DbSqlSession - SQL: create table ACT_RE_MODEL (
ID_ varchar(64) not null,
REV_ integer,
NAME_ varchar(255),
KEY_ varchar(255),
CATEGORY_ varchar(255),
CREATE_TIME_ timestamp(3) null,
LAST_UPDATE_TIME_ timestamp(3) null,
VERSION_ integer,
META_INFO_ varchar(4000),
DEPLOYMENT_ID_ varchar(64),
EDITOR_SOURCE_VALUE_ID_ varchar(64),
EDITOR_SOURCE_EXTRA_VALUE_ID_ varchar(64),
TENANT_ID_ varchar(255) default '',
primary key (ID_)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin
6,使用java api 执行流程。
先贴出代码:
package com.maven.web.controller;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.maven.web.common.ErrorCode;
import com.maven.web.common.ListResult;
import com.maven.web.common.Result;
import com.maven.web.util.Constant;
@RestController
public class ActivitiController {
public static final Logger logger = LoggerFactory.getLogger(ActivitiController.class);
@Autowired
private ProcessEngineConfiguration processEngineConfiguration;
@Autowired
private ProcessEngine processEngine;
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private HistoryService historyService;
@Autowired
private ManagementService managementService;
@Autowired
private IdentityService identityService;
/**
* 流程发布
* 可以发布多次,会取最新版本的流程
* @param flowName 需要发布的流程名称
* @return 状态码
*/
@RequestMapping(value="/process/release",method=RequestMethod.GET)
public Result release(String flowName){
logger.info("-> 开始发布流程:{}。",flowName);
repositoryService.createDeployment()
.addClasspathResource(Constant.DIAGRAMS.concat(File.separator).concat(flowName).concat(Constant.BPMN))
.deploy();
logger.info("-> 流程:{}已成功发布。",flowName);
Result r = new Result(ErrorCode.SUCCESS);
return r;
}
/**
* 查看所有已发布流程(不管流程是否已启动)
* @return 已发布流程集合
*/
@RequestMapping(value="/process/release/list",method=RequestMethod.GET)
public ListResult
下面具体来看各个接口实现:
6.1,上面建好了任务流程,需要发布到activiti引擎中。发布意味着引擎会把BPMN2.0 xml解析成可以执行的东西,“发布包”中的所有流程定义都会添加到数据库中。
http://localhost:8088/spring-web/process/release?flowName=my-process
发布成功后数据库对应表act_re_procdef会添加一条数据:
6.2,发布流程到activiti引擎后,可以启动流程。单个流程可以启动多个实例(也就是可以提出多次同样的申请)。
http://localhost:8088/spring-web/process/start?flowName=my-process
这里执行两次,可以查看数据act_ru_task,主管审批任务就有两条:
6.3,流程启动后第一个节点就是主管审批,主管用户可以查看自己需要完成的任务。
http://localhost:8088/spring-web/user/task/undo?userName=usertask1
6.4,完成任务。
http://localhost:8088/spring-web/task/complete?taskId=12
再次查看任务数据表act_ru_task:
任务流程已经到了下一个节点,经理审批。
6.5,实际上各个节点的审批人可以动态设置,允许使用表达式 ,具体可以查看官网提供的api 文档:activiti api使用
7,测试过程中遇到的问题。
(1) 开始使用版本5.19.0,在执行查询操作时会报sql语句错误,默认会有排序,语句重复:
【order by order by ** asc】,更换版本为5.22.0后查询正常。
(2) 调用activiti api 查询数据直接返回会抛异常,无法正常解析成Json数据。
这是因为返回的结果,例如List