一 是什么
工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。在计算机中,工作流属于计算机支持的协同工作(CSCW)的一部分。后者是普遍地研究一个群体如何在计算机的帮助下实现协同工作的。
二 用来干嘛
工作流的用途非常广泛,生活中经常会碰到 流程的问题 ,比如:请假,这就是一个非常典型的实例,它需要很多的人员参与,按照特定的顺序,以及进行相对的处理。
三 怎么用
准备工作 先下载相对的插件 安装成功之后 输入act 即可看到,如果安装失败就自己百度去,这里就不在做过多的解释了
1)首先我们要加载表数据以及获取核心引擎对象
- 方法一 通过设置ProcessEngineConfiguration(流程引擎配置对象)直接在main方法里面运行
ProcessEngineConfiguration process = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
process.setJdbcDriver("com.mysql.jdbc.Driver");
process.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8");
process.setJdbcUsername("root");
process.setJdbcPassword("root");
process.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);//建表模式
ProcessEngine processEngine = process.buildProcessEngine();
- 方法二 通过spring 的依赖注入获取 配置在spring文件里面
<!-- 定义流程引擎配置 -->
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseSchemaUpdate" value="true" />
<property name="jobExecutorActivate" value="false" />
<property name="databaseSchema" value="ACTIVITI" />
</bean>
<!-- 定义流程引擎 -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
2)获取ProcessEngine(流程引擎对象)
ProcessEngine 是activiti的核心对象,可以通过调用它获取各个service 对象,每个对象又有不同的方法。
ProcessEngine 一共提供七个服务,简单的列出以下几个常用的服务
服务名字 | 作用 |
---|---|
RepositoryService | 管理流程定义 |
RuntimeService | 执行管理,包括启动、推进、删除流程实例等操作 |
TaskService | 任务管理 |
HistoryService | 历史管理(执行完的数据的管理) |
3)绘制流程图
在你选择你的文件路径 new>Other>Activiti Diagram 然后输入流程图的名字 就可看到如下图
流程图都由开始节点(StartEvent),结束节点(EndEvent),线(SequenceFlow)用来连接各个组件。建立一个简单的 流程图
以上就是一个非常典型的请假流程,流程顺序为 :开始 > 员工请假 > 经理审批 > 结束
4)通过RepositoryService 部署流程
- 方法一 根据流程图名 部署
Deployment deployment = processEngine.getRepositoryService().createDeployment().name("MyProcess")//设置名字
.addClasspathResource("MyProcess.bpmn")//这里填写流程图的名字
.deploy();
- 方法二 以压缩文件的形式 部署
Deployment deployment=processEngine.getRepositoryService().createDeployment().name("VehicleApplication")
.addZipInputStream(zipInputStream)//这里是zip格式文件流 rar 等其他的 都不行
.deploy()
查看已经部署的定义流程
processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);
删除已经部署的定义流程
processEngine.getRepositoryService().deleteDeployment(deploymentId);
5)启动 已经部署的流程
常用的都是根据id或者key启动
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("myProcess");
System.out.println(pi.getId() + "====Id");
System.out.println(pi.getName() + "====Name");
System.out.println(pi.getActivityId() + "====ID");
动态的设置申请人 我这写的是jfd
Map<String, Object> map = new HashMap<>();
map.put("user", "jfd");
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("myProcess", map);
6)任务(task)查询
String assignee = "王五";
List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的Service
.createTaskQuery()// 创建任务查询对象
/** 查询条件(where部分) */
.taskAssignee(assignee)// 指定个人任务查询,指定办理人
// .taskCandidateUser(candidateUser)//组任务的办理人查询
// .processDefinitionId(processDefinitionId)//使用流程定义ID查询
// .processInstanceId(processInstanceId)//使用流程实例ID查询
// .executionId(executionId)//使用执行对象ID查询
.orderByTaskCreateTime().asc()// 使用创建时间的升序排列
// .singleResult()//返回惟一结果集
// .count()//返回结果集的数量
// .listPage(firstResult, maxResults);//分页查询
.list();// 返回列表
if (list != null && list.size() > 0) {
for (Task task : list) {
System.out.println("任务ID:" + task.getId());
System.out.println("任务名称:" + task.getName());
System.out.println("任务的创建时间:" + task.getCreateTime());
System.out.println("任务的办理人:" + task.getAssignee());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("执行对象ID:" + task.getExecutionId());
System.out.println("流程定义ID:" + task.getProcessDefinitionId());
System.out.println("########################################################");
}
7)流程向下运行(任务的完成)
单节点 向下执行即可
processEngine.getTaskService().complete(task.getId());
当节点链接了多个节点时候 map 里面要含有分支条件
processEngine.getTaskService().complete(task.getId(),map);
这里的map 要包含msg的信息 而且在流程图里面也要有判断方式