1 Activity工作流
工作流就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现"。
工作流管理系统是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流逻辑进行工作流实例的执行。工作流管理系统不是企业的业务系统,而是为企业的业务系统的运行提供了一个软件的支撑环境。
主流Java工作流框架:JBPM、Activiti
1.1 Activiti框架开发流程
1.画流程图
2.部署流程图
3.启动流程
4.处理任务节点
1.2 Eclipse插件安装
在线安装:Help --> Install New Software…
Name:Activiti BPMN 2.0 designer
Location:http://activiti.org/designer/update/
离线安装:eclipse离线安装Activiti Designer插件
在线安装很慢,我是离线安装的,注意Finish之后,右下角会有读条,安装过程中会有安全提示,需要确认,安装结束后会提示重启,重启之后可以 new --> other 会有Activiti的选项。
自动保存图片:window --> preferences --> Activiti --> Save Actions 勾上Create process definition image when saving the diagram
1.3 简单流程图
Properties窗口可以在window -->show view --> other 中找到,用于修改任务名称
本质是XML文件
1.4 流程引擎
1.4.1 依赖
pom.xml
<!-- Activiti -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.22.0</version>
</dependency>
<!-- mysql connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
1.4.2 用代码初始化流程引擎
运行后对应的数据库会生成表
public class ActivitiTest {
//初始化流程引擎,生成23张表
@Test
public void initProcessEngine() {
//1.创建一个流程引擎配置对象,基于静态工程的方式创建
ProcessEngineConfiguration configuration=ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
//2.配置数据源
configuration.setJdbcUrl("jdbc:mysql://localhost:3306/test");
configuration.setJdbcDriver("com.mysql.jdbc.Driver");
configuration.setJdbcUsername("root");
configuration.setJdbcPassword("");
//3.配置生成策略
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);//没有表就生成,有就用现有的
//4.基于流程配置创建流程引擎
ProcessEngine engine= configuration.buildProcessEngine();
//5.输出引擎的信息
System.out.println(engine.getName());
}
}
1.4.3 用Spring初始化流程引擎
创建配置文件
<?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-3.0.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test1"></property>
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value=""></property>
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
使用方式
@Test
public void initProcessEngine() {
//读取配置文件 avtiviti.cfg.xml
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(defaultProcessEngine.getName());
}
1.5 部署流程
1.5.1 部署代码
//部署流程
@Test
public void buildProcess() {
//1.获取流程对象
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//2.基于流程引擎对象获取 流程部署服务 对象
RepositoryService service = engine.getRepositoryService();
//3.通过这个service来部署流程图
DeploymentBuilder builder = service.createDeployment();
Deployment deployment = builder.name("请假申请")
.addClasspathResource("MyProcess.bpmn")
.addClasspathResource("MyProcess.png")
.deploy();
//4.输出流程部署对象的信息
System.out.println("流程部署成功");
System.out.println("流程部署Id:"+deployment.getId());
System.out.println("流程部署名称:"+deployment.getName());
}
1.5.2 相关表
act_re_deployment :流程部署的基本信息表
act_re_procdef:流程部署的定义表,跟流程部署信息表是一对一的关系
act_ge_bytearray:流程部署的流程图信息表
1.6 启动流程
1.6.1 启动代码
根据key启动流程
//根据Key启动流程
@Test
public void startProcess() {
//1.获取流程引擎对象
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//2.获取运行时service
RuntimeService service = engine.getRuntimeService();
//3.通过service前期的流程,创建一个流程实例
ProcessInstance instance = service.startProcessInstanceByKey("myProcess");
//4.打印流程实例对象的信息
System.out.println("流程定义ID:"+instance.getProcessDefinitionId());
System.out.println("流程实例ID:"+instance.getId());
}
1.6.2 相关表
act_ru_execution:流程实例信息表
act_ru_task:当前执行到哪个任务节点
1.7 处理任务节点
1.7.1 处理代码
查询任务
//查询任务
@Test
public void queryTask() {
//1.获取流程引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//2.获取任务service
TaskService service = engine.getTaskService();
//3.任务信息
List<Task> list = service.createTaskQuery().list();
//4.罗列任务信息
for(Task task:list) {
System.out.println("任务Id:"+task.getId());
System.out.println("任务Name:"+task.getName());
System.out.println("任务处理人:"+task.getAssignee());
System.out.println("任务所属的流程实例Id:"+task.getProcessInstanceId());
System.out.println("任务所属的流程定义Id:"+task.getProcessDefinitionId());
}
//完成任务
@Test
public void completeTask() {
//1.获取流程引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//2.获取任务service
TaskService service = engine.getTaskService();
service.complete("5004");
System.out.println("5004当前任务节点已完成,将进入下一个任务节点");
}
}
1.8 处理逻辑和处理人
处理逻辑:Gateway:分支
处理人:Properties --> Main Config --> Assignee
通过处理人查找任务
List<Task> list2 = service.createTaskQuery().taskAssignee("").list();
1.9 流程控制
complete:先画那条线走那条
设置连接线上的 Main config中的condition,使用多参数的complete方法跳转
假设连接线上的condition为 ${flag == false}
则
HashMap<String, Object> map=new HashMap<String, Object>();
map.put("flag", false);
service.complete("5004",map);
其中5004为想要推进的流程的ID
1.10 Activiti小结
工作流其实就是某些任务分解出来的流程,Activiti框架用表和各种service简化了对应流程的开发,我们可以在图形化的界面上拖动来创建流程图,然后通过service来创建并推进流程实例。
参考链接
1.Activiti工作流-实战篇(用Activiti框架快速开发我们的工作流)
2.Activity工作流(2)-入门安装运行第一个例子
3.eclipse安装activiti工作流插件
4.eclipse离线安装Activiti Designer插件
5.基于SSM+Shiro+Activity+Layui开发企业级项目【完整版】P62~P73