工作流的学习《一》:工作流的部署、启动、查询和完成任务
** 工作流学习 <一>**
工作流的流程部署、启动、查询、(任务)完成。
在进行工作流的上述四部操作是需要用到一个工作流的引擎 – 核心工作流引擎ProcessEngine:
ProcessEngine processEngine = ProcessEngines…getDefaultProcessEngine(); //工作流的核心引擎
1.工作流的部署:
工作流的三种部署形式:在部署时加载源文件、加载zip文件、通过InputStream字节流对文件进行读取。
1.1)直接加载流程文件的形式:
Deployment deployment = processEngine.getRepositoryService() //与部署流程定义有关Service
.createDeployment() //创建部署对象
.name("部署请假流程") //设置部署名称
.addClasspathResource("bpmn/Test.bpmn") //加载bpmn文件
.addClasspathResource("bpmn/Test.png") //加载png文件
.deploy(); //完成部署
**1.2)加载zip文件:**将.bpmn文件和.png文件压缩成.zip文件,在部署时加载.zip文件进行流程部署
InputStream in = this.getClass().getClassLoader().getResourceAsStream("bpmn/Test.zip"); //字节流的形式在家zip文件
ZipInputStream zis = new ZipInputStream(in);
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()
.name("请假流程Test")
.addZipInputStream(zis)
.deploy();
1.3)InputStream字节流加载流程文件:
/**
* 加载流程文件
*/
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("personalTaskDemo/personalTaskProcess.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("personalTaskDemo/personalTaskProcess.png");
/**
* 部署流程
*/
Deployment deployment = processEngine.getRepositoryService() //与部署有关的Service
.createDeployment() //创建部署对象
.name("个人任务(动态分配办理人)") //设置部署的流程name
.addInputStream("personalTaskProcess.bpmn",inputStreamBpmn) //加载流程bpmn文件
.addInputStream("personalTaskProcess.png",inputStreamPng) //加载流程png文件
.deploy(); //部署成功
2. 启动流程 :通过流程定义的Key启动流程 – 在设计流程时设置的流程的ID:
String processDefinitionKey = "personalTaskByClass";
ProcessInstance pi =processEngine.getRuntimeService() //与执行对象和流程实例相关的Service
.startProcessInstanceByKey(processDefinitionKey); //启动流程实例--使用流程定义的key,并设置任务的办理人
3. 查询:通过任务的办理人查询流程信息
/**
* 查询个人任务 -- 通过办理人
*/
@Test
public void queryTaskByApplyPerson(){
/**
* 任务办理人
*/
String taskAssignee = "李四";
/**
* 查询操作
*/
List<Task> list = processEngine.getTaskService() //与任务相关Service
.createTaskQuery() //创建查询
.taskAssignee(taskAssignee) //查询条件 -- 通过任务办理人
.orderByTaskId().desc() //查询结果排序
.list(); //返回结果 - list
if(list!=null){
for(Task task : list){
System.out.println("任务ID:"+task.getId());
System.out.println("任务办理人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
System.out.println("任务开始时间:"+task.getCreateTime());
System.out.println("任务执行对象ID:"+task.getExecutionId());
System.out.println("任务实例ID:"+task.getProcessInstanceId());
System.out.println("任务间隔时间:"+task.getDueDate());
System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
}
}
}
5. 完成:通过任务ID完成任务
/**
* 完成任务
*/
@Test
public void processEnd() {
/**
* 需要完成的任务id
*/
String taskID = "10404";
/**
* 完成任务
*/
processEngine.getTaskService()
.complete(taskID);
System.out.println("任务完成!!!" + taskID);
}
在任务完成前,任务的办理人可以将自己的任务分配给其他人来完成:
public void setAssigneeTask(){
/**
* 任务id
*/
String taskId = "10404";
/**
* 分配给的人
*/
String assignee = "李四";
processEngine.getTaskService()
.setAssignee(taskId,assignee);
System.out.println("任务分配成功!!!"+assignee);
}