1. 新建一个maven项目
2. pom.xml文件添加所需依赖:
org.activiti
activiti-engine
5.21.0
org.activiti
activiti-spring
5.21.0
org.codehaus.groovy
groovy-all
2.4.3
org.slf4j
slf4j-api
1.7.6
org.slf4j
slf4j-jdk14
1.7.6
junit
junit
3.8.1
test
mysql
mysql-connector-java
5.1.38
3. 创建activiti数据表,具体操作如下:
1) 创建配置文件:activiti.cfg.xml,添加以下代码:(我用的是mysql数据库)
2) 写CreateTable.java创建表,代码如下:
publicclass CreateTable {
@Test
publicvoid createTable(){
ProcessEngine processEngine =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")
.buildProcessEngine();
System.out.println("processEngine="+processEngine);
}
}
3) 跑下上面代码就可以了,数据库中会多出25张数据表
4. 创建process.bpmn画流程图:(简单画一个请假例子,填写基本信息key和name,添加一个开始事件和结束事件Event:StartEvent、EndEvent,以及添加两个Task事件:UserTask)
点击对应task分配任务人assignee,在main config下填写:
该bpmn文件选择用xml形式打开的话,生成上面所画的代码如下:
5. 好了下面开始真正的流程操作了,我们创建一个operate.java文件来操作流程,具体步骤如下:
1)部署我们创建的bpmn流程如到数据库中:(运行后:在act_re_deployment流程部署表和act_re_procdef流程定义表中会有对应的数据信息)
private static ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
@Test
public void delployFlow(){
Deploymentdeployment = processEngine.getRepositoryService()
.createDeployment()
.name("helloworld")
.addClasspathResource("Process.bpmn")
.addClasspathResource("Process.png")
.deploy();
System.out.println(deployment.getId());
System.out.println(deployment.getName());
}
补充下:
上面中的png文件,如果保存bpmn不会自动生成PNG文件的话可以以下操作:
Window->preferences->activity->saveaction->把create process这个选择框勾上;
解释下ProcessEngine这个类,在Activiti中最核心的类,其他的类都是由他而来,例如:
上面的processEngine.getRepositoryService()//管理流程定义
1.1 RuntimeService :是activiti的流程执行服务类,可以从这个服务类中获取很多关于流程执行的相关的信息。
1.2 TaskService是activiti的任务服务类。可以从这个类中获取任务的相关信息,如当前正在执行的个人待办和用户组待办任务。
1.3 HistoryService是activiti的查询历史信息的类,在一个流程执行完成后,这个对象为我们提供查询历史信息,可以跟踪流程实例对应所有待办节点的运行情况。
1.4 ProcessDefinition流程定义类,可以从这里获得资源文件等。
1.5 ProcessInstance代表流程定义的执行实例,当一个部署的流程图启动后,该流程只有一条流程实例数据,但是它的流程任务可以有多个,每个任务对应流程图中相应的流程节点。
2)接着上面后开启流程:
@Test
publicvoid flowStart(){
RuntimeServiceruntimeService = processEngine.getRuntimeService();
//用key启动时按照最新的流程图版本定义启动
ProcessInstanceprocessInstance = runtimeService.startProcessInstanceByKey("HelloWorldKey");
}
补充:
其中runtimeService.startProcessInstanceByKey("HelloWorldKey")中的HelloWorldKey对应流程图中的ID值,在数据表中对应act_re_procdef流程定义表中的key字段
启动完流程后在act_ru_execution表中会产生一条数据,这条数据为当前流程正在执行的任务,其中act_id_字段的值对应流程图节点的ID值在act_ru_task表中会产生一条任务数据,execution_id_对应act_ru_execution主键,proc_inst_id_为流程实例ID,name_值为流程节点名称,assignee_字段为该待办当前的处理人(也就是上面我们在画流程图中所设置的cwh)
3)查询下任务人所有的任务:
@Test
publicvoid findMyPersonTask(){
Stringassignee = "cwh";
ListtaskList= processEngine.getTaskService()//获取任务service
.createTaskQuery()//创建查询对象
.taskAssignee(assignee)//指定查询人
.list();
if(taskList.size()>0){
for (Task task : taskList){
System.out.println("代办任务ID:"+task.getId());
System.out.println("代办任务name:"+task.getName());
System.out.println("代办任务创建时间:"+task.getCreateTime());
System.out.println("代办任务办理人:"+task.getAssignee());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("执行对象ID:"+task.getExecutionId());
}
}
}
4) 提交任务到下一个任务人(也就是提交我们的申请到经理手中去)
@Test
publicvoid completeTask(){
StringtaskId = "17504"; processEngine.getTaskService().complete(taskId);//完成任务
System.out.println("完成任务,任务ID"+taskId);
}
补充:taskId对应上面数据表act_ru_task中所生成的ID,也就是我们上面通过cwh查询出来的任务id,提交后该笔任务就到了下一个人手上(也就是经理,我们上面设置的assignee ‘menco’)那么我们查询下menco的任务信息,调用上面3)写的findMyPersonTask():改查询条件assignee为‘menco’
5) 经理拿到该条申请后,进行审批然后提交之后那么该笔任务流程也就结束了
@Test
publicvoid completeTask1(){
Stringtaskid = "20002";
TaskServicetaskService = processEngine.getTaskService();
processEngine.getTaskService().complete(taskid);//完成任务
System.out.println("完成任务,任务ID"+taskid);
}