Activiti开发环境搭建和依赖解决
1 简介
由于一个月后要参加的项目主要使用Java技术,在开发过程中主要使用了Spring-Boot,MyBatis,Activiti三个大的框架,又要与数据库Mysql进行集成在一起。Activiti工作流引擎可以理解为从开始节点发起流程开始,然后经过其中多个节点,并完成动作[任务Task],最后到结束节点的整个过程。常见的实例诸如在淘宝上买东西,需要经过的步骤有下订单,付款,收获,在业务流开发中这样的工作流的情形也还有许多,诸如出差申请、办公用具申请、采购物品。工作流引擎就是为了减轻处理工作流节点间流向问题处理的复杂性,也便于集中管理。
工作流workflow主要实现了业务过程的部分或整体在计算机应用环境下的自动化,主要解决的是“使多个参与者之间按照某种预定义的规则传递文档,从而实现某个预期的业务目标,或者促使此目标的实现。”因此在工作流中,常见的关键概念有规则、信息、文档、任务、目标、流程等。工作流管理系统是一个系统如阿健,它可以完成流程的定义和管理,并按照在系统中预先定义号的工作流逻辑进行过左流实例的执行。工作流管理系统不是企业的业务系统,而是为企业的业务系统提供了一个软件的支撑环境。工作流管理系统被用来定义、管理和执行工作流程。工作流管理系统的目标是确保工作在正确的时间被预期的人员所执行,在自动化的业务过程中插入人工光的执行和干预。也可以看做设计模式中不变的部分和变化的部分的分离。
2 Activiti七大服务介绍
2.1 RepositoryService
提供对流程定义和部署仓库的访问。流程仓库Service,用于管理流程仓库,部署、删除、读取流程资源
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
Repository rs = engine.getRepositoryService();
Developmengt builder = rs.createDeployment();
Builder.addClasspathResource(“test3.bpmn”);
Deployment dep = builder.addClasspathRepository();
ProcessDefintion def = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
2.2 TaskService
Service which provides access to Task and form related operation。
任务Service,用于管理、查询任务,例如签收,办理,指派。
2.3 IdentityService
用来管理用户和组的服务。可以管理和查询用户,组之间的关系
public static void main(String[] args) {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService ts = engine.getTaskService();
IdentityService is = engine.getIdentityService();
// 创建任务
String taskId = UUID.randomUUID().toString();
Task task = ts.newTask(taskId);
task.setName("测试任务");
ts.saveTask(task);
// 创建用户
String userId = UUID.randomUUID().toString();
User user = is.newUser(userId);
user.setFirstName("angus");
is.saveUser(user);
// 设置任务的候选用户组
ts.addCandidateUser(taskId, userId);
List<Task> tasks = ts.createTaskQuery().taskCandidateUser(userId).list();
System.out.println(userId + " 这个用户有权限处理的任务有:");
for(Task t : tasks) {
System.out.println(t.getName());
}
}
2.4 RuntimeService
运行时Service,可以管理和查询所有正在运行状态的流程实例、任务。
public static void main(String[] args) {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
// 部署
Deployment dep = rs.createDeployment()
.addClasspathResource("receiveTask.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
// 查当前的子执行流(只有一个)
Execution exe = runService.createExecutionQuery()
.processInstanceId(pi.getId()).onlyChildExecutions()
.singleResult();
System.out.println(pi.getId() + ", 当前节点:" + exe.getActivityId());
// 让它往前走
runService.trigger(exe.getId());
exe = runService.createExecutionQuery()
.processInstanceId(pi.getId()).onlyChildExecutions()
.singleResult();
System.out.println(pi.getId() + ", 当前节点:" + exe.getActivityId());
}
2.5 ManagementService
Service for admin and maintenance operations on the process engine.
引擎管理Service,和具体业务无关,主要是可以查询引擎配置、数据库、作业等。
2.6 HistoryService
历史Service,可以查询所有历史数据,例如,流程实例、任务、活动、变量、附件。
2.7 FormService
表单Service,用于读取和流程任务相关的表单数据
3 开发环境
在自己的开发机上安装的开发环境如下:
1. 系统 win7 Service Pack 1
2. Java jdk java version “1.8.0_181” 64位
3. Eclipse Eclipse Java EE IDE for Web Developers
Version: Mars Release(4.5.0)
Build-id: 20150621-1200
4. Mysql 8.0.11
5. Activiti Designer插件 Activiti Designer 5.18.0.zip
6. Navicat for MySQL 10.0.11
注意:需要确保Eclipse已经安装好Activiti Designers。能够使用插件绘制Bpmn文件才可。
3.1 Activiti Designer插件集成Eclipse
在该下载目录下可以下载jar4,其中有4个jar包。
org.eclipse.emf.validation.ui_1.7.0.201403111711.jar、
org.eclipse.emf.workspace_1.5.1.201306111400.jar、
org.eclipse.emf.validation_1.8.0.201403111711.jar
org.eclipse.emf.transaction_1.4.0.201306111400.jar;
Activiti-Designer下载链接如下:
https://github.com/Activiti/Activiti-Designer/releases
两个下载之后即可在内网安装。如果联网安装的话,直接eclipse->Help->Install New SoftWare输入网址
,即上面截图的update-site.按照提示安装即可
4 程序结构
5 依赖解决和配置文件作用
由于Activiti涉及到与Mysql的集成,并且自己并非是又maven管理的jar包依赖,在学习杨恩雄老师的视频过程中,杨老师也是把所有的以来包全部下载下来,然后导入新的项目,这样虽然每个项目比较臃肿,但是却能保证每个项目相互独立。或许联网开发时,使用maven管理jar包依赖是一个更加省心的解决方式。文档仍把所有的jar包依赖下载下来。
5.1 下载依赖和依赖解决
附件是Activiti6.0.0使用时的jar包依赖,需要的话可以直接从该url下载,亦或者可以通过杨恩雄老师的视频提供的链接也可。解压之后。
5.1.1 根据mysql版本查找对应的驱动
例如开发机上安装的是8.0.11,因此去以下网址查找该版本mysql对应的驱动jar包。
http://mvnrepository.com/
解压压缩包即可。
5.1.2 拷贝至项目lib 目录下
之前下载好的mysql驱动和lib目录下的mysql-connector-java合适版本。替换lib目录下该文件,全选所有文件,拷贝到项目lib目录下。
5.1.3 Add jars
需要把加入的jar包,通过add jars,操作方式如下:
选中Add jars会弹出如下的框,在lib目录下,选中所有的jar包,加入即可。
5.2 配置文件
5.2.1 activiti.cfg.xml
该配置文件用来和mysql数据库进行交互,内容为连接数据库的方式,用户名,密码之类。修改对应的值适配开发机上的mysql配置即可。
<?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 -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ACT" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="123456" />
<property name="databaseSchemaUpdate" value="true" />
<!--
<property name="createDiagramOnDeploy" value="false" />
-->
</bean>
</beans>
5.2.2 log4j.properties
log4j.rootLogger=INFO, stdout
# Console Appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
# Custom tweaks
log4j.logger.com.codahale.metrics=WARN
log4j.logger.com.ryantenney=WARN
log4j.logger.com.zaxxer=WARN
log4j.logger.org.apache=WARN
log4j.logger.org.hibernate=WARN
log4j.logger.org.hibernate.engine.internal=WARN
log4j.logger.org.hibernate.validator=WARN
log4j.logger.org.springframework=WARN
log4j.logger.org.springframework.web=WARN
log4j.logger.org.springframework.security=WARN
该配置文件负责打印一些日志信息。
log4j-1.2.17.jar。
打印的日志类似如下
控制台打印的日志信息:
[26 10:08:52,117 DEBUG] [main] sql.PreparedStatement - ==> Executing: select * from address WHERE aid=?
[26 10:08:52,118 DEBUG] [main] sql.PreparedStatement - ==> Parameters: 4(Integer)
[26 10:08:52,131 DEBUG] [main] sql.ResultSet - <== Columns: aid, address, postCode, ownerid
[26 10:08:52,132 DEBUG] [main] sql.ResultSet - <== Row: 4, 北京, 010, null
[26 10:08:52,133 DEBUG] [main] spring.SqlSessionUtils - Closing no transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@8dcd5d]
[26 10:08:52,134 DEBUG] [main] datasource.DataSourceUtils - Returning JDBC Connection to DataSource
address=======北京
6 first-act
6.1 项目工程结构如下
6.2 常见步骤
6.2.1 Activiti Designer插件绘制Bpmn
在resource目录下通过Activiti Designer插件绘制Bpmn流程文件。该文件可以通过Open With XML Editor编辑器打开。
6.2.2 在src源码包下的package下添加java文件
在src源码包下添加package org.crazit.act.c3。然后选中package,新建java类FirstACT.java。文件内容如下:
package org.crazyit.act.c3;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
public class FirstAct {
public static void main(String[] args) throws Exception {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
rs.createDeployment().addClasspathResource("first.bpmn").deploy();
ProcessInstance pi = runService.startProcessInstanceByKey("myProcess");
// 普通员工完成请假的任务
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前流程节点:" + task.getName());
taskService.complete(task.getId());
// 经理审核任务
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前流程节点:" + task.getName());
taskService.complete(task.getId());
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("流程结束后:" + task);
engine.close();
System.exit(0);
}
}
6.2.3 运行查看结果
一般会通过输出语句把信息输出到控制台,另外因为Activiti需要频繁与数据库进行交互,因此,使用Navicat for mysql工具可以通过界面观察数据库的变化。相互验证。
7 结束语
由于现在了解的activiti工作流开发的内容较少,所以本篇文档的主要内容并不复杂,主要的作用是留存jar包,activiti.cfg.xml,log4j.properties文件的内容,如果能为学习activit工作流开发的人提供一点帮助就更好了。
上一篇: 辅导资料 整数的基本性质与应用(最大公约数 最小公倍数 素数 )
下一篇: 以假当真