一:工作流的概念
工作流(Workflow),是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在“多个参与者”之间按照某种“预定义的规则”传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。通俗的说,就是多个人在一起合作完成某件事情的步骤,把步骤变成计算机能理解的形式就是工作流。
Activiti是工作流框架,是解决企业流程管理的解决方案。
二:Activiti介绍
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架
1、Activiti基于Apache许可的开源BPM平台
2、Activiti和业界也用的多的JBPM历史渊源。
创始人Tom Baeyens是JBoss jBPM4的项目架构师,后来去Alfresco做了继承和发展了Activiti.而Jboss公司抛弃了JBPM4的设计思想,重新设计开发了JBPM5.所以原来习惯于JBPM4的大部分用户都使用Activiti
3、它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。 并且提供了Demo,可以从里面抽取流程在线设计器。比较强大。
三:准备环境
1.安装流程设计器(eclipse插件)
2.导包(activiti-所需要的环境jar包)
3.初始化数据库三种方式
3.1编码方式
/**
* 创建ProcessEngine引擎对象:
* 就会自动创建数据和25张表
*/
@Test
public void createProcessEngine1() {
// 是一个接口:我们需要去连接数据库,肯定需要很多连接信息,就是配置信息,所以先做配置对象,再通过配置对象构建引擎
// ProcessEngine
//①:创建引擎的配置对象
ProcessEngineConfiguration configuration=ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
//②:做引擎配置对象的配置
configuration.setJdbcUrl("jdbc:mysql:///activiti?createDatabaseIfNotExist=true");
configuration.setJdbcDriver("com.mysql.jdbc.Driver");
configuration.setJdbcUsername("root");
configuration.setJdbcPassword("root");
//设置创建数据库表的策略:true:创建
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
//③:通过引擎配置对象构建引擎
ProcessEngine pe = configuration.buildProcessEngine();
// org.activiti.engine.impl.ProcessEngineImpl@3c947bc5
System.out.println(pe);
}
3.2 配置方式
配置文件:
<!-- 创建ProcessEngineConfiguration对象的bean -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- 配置对象的配置信息 :连接数据库,使用MyBatis连接池 -->
<property name="jdbcUrl"
value="jdbc:mysql:///activiti?createDatabaseIfNotExist=true" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="root" />
<property name="databaseSchemaUpdate" value="true" />
</bean>
Java代码如下:
/**
* 通过加载配置文件activiti.cfg.xml来创建
* @throws Exception
*/
@Test
public void createProcessEngine2() throws Exception {
//①:通过引擎配置对象创建一个配置对象:加载classpath下的配置文件:activiti.cfg.xml
ProcessEngineConfiguration configuration = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//②:通过引擎配置对象创建引擎
ProcessEngine pe = configuration.buildProcessEngine();
// org.activiti.engine.impl.ProcessEngineImpl@3c947bc5
System.out.println(pe);
}
3.3 最佳实践
/**
* 配置文件都是按照一定规则来的:activiti.cfg.xml有统一的命名规范,,放在resource下
* 使用框架提供的默认方法创建
* @throws Exception
*/
@Test
public void createProcessEngine3() throws Exception {
ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
}
四:Activiti的使用
repositoryService 管理流程规则相关,流程定义
1 发布流程
// 获取流程发布对象
DeploymentBuilder createDeployment = repositoryService.createDeployment();
2 查询部署列表和流程定义的列表
3 删除-真删除和假删除(挂起和激活)
4 查看流程图
// 添加发布部署
@Test
public void test1() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
// 获取流程发布对象
DeploymentBuilder createDeployment = repositoryService.createDeployment();
// 上传资源
createDeployment.addClasspathResource("MyProcess.bpmn");
createDeployment.addClasspathResource("MyProcess.png");
createDeployment.name("xxx");
// 部署发布
Deployment deploy = createDeployment.deploy();
}
// 删除部署(真删)
@Test
public void test2() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
repositoryService.deleteDeployment("2501");
}
// 假删除部署 (挂起和激活)
@Test
public void test3() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
// 挂起
//repositoryService.suspendProcessDefinitionByKey("myProcess");
// 激活
repositoryService.activateProcessDefinitionByKey("myProcess");
}
// 显示流程图片
@Test
public void test4() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
// web项目输出到浏览器的输入流
// 模拟输出本地硬盘
// 获取png图片
String deploymentId="5001";
String resourceName="MyProcess.png";
// 获取输入的流对象 读的字节
InputStream resourceAsStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
//模拟输出本地硬盘
IOUtils.copy(resourceAsStream, new FileOutputStream("f:/b.png"));
}
// 查询部署列表
@Test
public void test5() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
// 查询对象
DeploymentQuery createDeploymentQuery = repositoryService.createDeploymentQuery();
// 设置查询条件
// createDeploymentQuery.deploymentName(name)
//createDeploymentQuery.deploymentId(deploymentId)
//createDeploymentQuery.deploymentNameLike(nameLike)
//createDeploymentQuery.listPage(firstResult, maxResults)
//createDeploymentQuery.singleResult();
List<Deployment> list = createDeploymentQuery.list();
for (Deployment deployment : list) {
System.out.println(deployment.getDeploymentTime());
}
}
// 查询流程定义信息列表
@Test
public void test6() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
// 获取查询对象
ProcessDefinitionQuery createProcessDefinitionQuery = repositoryService.createProcessDefinitionQuery();
// 设置查询条件
//createProcessDefinitionQuery.listPage(firstResult, maxResults)
List<ProcessDefinition> list = createProcessDefinitionQuery.list();
for (ProcessDefinition pd : list) {
System.out.println(pd);
}
}
##runtimeService、tasksService
1 启动流程
processkey启动
2 查询任务列表
查询某个人的列表
// TaskService 任务
TaskService taskService = defaultProcessEngine.getTaskService();
// 获取查询对象
TaskQuery createTaskQuery = taskService.createTaskQuery();
// 设置条件
list 分页
3 完成任务
私有任务(一个人)
公有任务(多个人)
4 完成私有任务
taskService.complete(taskId);
5 完成公有任务
先认领任务
taskService.claim(taskId, userId);
然后在完成任务
taskService.complete(taskId);
6 查询实例状态是否就结束
// 添加发布部署
@Test
public void test1() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
// 获取流程发布对象
DeploymentBuilder createDeployment = repositoryService.createDeployment();
// 上传资源
createDeployment.addClasspathResource("codeProcess.bpmn");
createDeployment.addClasspathResource("codeProcess.png");
createDeployment.name("开发任务");
// 部署发布
Deployment deploy = createDeployment.deploy();
System.out.println(deploy);
}
// 启动流程实例
@Test
public void test2() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// runtimeService
RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
// 根据流程的定义key启动
ProcessInstance startProcessInstanceByKey = runtimeService.startProcessInstanceByKey("myProcess");
System.out.println(startProcessInstanceByKey);
}
// 获取任务列表
@Test
public void test3() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// TaskService
TaskService taskService = defaultProcessEngine.getTaskService();
// 获取查询对象
TaskQuery createTaskQuery = taskService.createTaskQuery();
List<Task> list = createTaskQuery.list();
for (Task task : list) {
System.out.println(task);
}
}
// 获取某个人的任务列表
@Test
public void test4() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// TaskService
TaskService taskService = defaultProcessEngine.getTaskService();
// 获取查询对象
TaskQuery createTaskQuery = taskService.createTaskQuery();
// 设置查询条件
createTaskQuery.taskAssignee("ls");
List<Task> list = createTaskQuery.list();
for (Task task : list) {
System.out.println(task);
}
}
// zs 办理完成任务 私有任务
@Test
public void test5() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// TaskService
TaskService taskService = defaultProcessEngine.getTaskService();
// 完成任务
String taskId = "10004";
taskService.complete(taskId);
}
// ww 办理完成任务
@Test
public void test6() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// TaskService
TaskService taskService = defaultProcessEngine.getTaskService();
// 完成任务
String taskId = "5002";
taskService.complete(taskId);
}
// zs 认领公有任务
@Test
public void test7() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// TaskService
TaskService taskService = defaultProcessEngine.getTaskService();
// 完成任务
String taskId = "2504";
String userId="zs";
// 要
taskService.claim(taskId, userId);
}
// ls 办理完成任务 私有任务
@Test
public void test8() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// TaskService
TaskService taskService = defaultProcessEngine.getTaskService();
// 完成任务
String taskId = "12502";
taskService.complete(taskId);
}
// 查询流程是否结束
@Test
public void test9() throws Exception {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RuntimeService
RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
// 查询对象
ProcessInstanceQuery createProcessInstanceQuery = runtimeService.createProcessInstanceQuery();
// 根据id
ProcessInstance singleResult = createProcessInstanceQuery.processInstanceId("2501").singleResult();
// 如果singleResult找到说明流程还没有结束
if (singleResult != null) {
System.out.println("流程未结束或不存在");
} else {
System.out.println("流程结束");
}
}
##historyService
// 有多少次执行这个实例流程
@Test
public void queryHisprocessdef() {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// 获取历史服务
HistoryService historyService = defaultProcessEngine.getHistoryService();
// 获取查询对象
HistoricProcessInstanceQuery createHistoricProcessInstanceQuery = historyService
.createHistoricProcessInstanceQuery();
// 设置查询条件
createHistoricProcessInstanceQuery.processDefinitionKey("myProcess");
// 获取列表
List<HistoricProcessInstance> list = createHistoricProcessInstanceQuery.list();
System.out.println( list.size());
}
// 获取活动节点日志--(查询那些人办理任务)
@Test
public void queryAci() {
// 获取核心对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// 获取历史服务
HistoryService historyService = defaultProcessEngine.getHistoryService();
// 获取查询对象
HistoricActivityInstanceQuery createHistoricActivityInstanceQuery = historyService
.createHistoricActivityInstanceQuery();
// 设置查询条件
createHistoricActivityInstanceQuery.processInstanceId("2501");
// 获取列表
List<HistoricActivityInstance> list = createHistoricActivityInstanceQuery.list();
for (HistoricActivityInstance ac : list) {
System.out.println("=================");
System.out.println(ac.getActivityId());
System.out.println(ac.getActivityName());
System.out.println(ac.getStartTime());
System.out.println(ac.getEndTime());
}
}