activiti入门2流程引擎的API和服务基础
2014-10-23 15:49
459 查看
RepositoryService : 管理和控制
发布包和
流程定义(包含了一个流程每个环节的结构和行为)的操作
除此之外,服务可以
查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。
获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。
获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。
RuntimeService :负责启动一个流程定义的新实例,获取和保存
流程变量,查询流程实例和执行
TaskService :所有与任务有关的功能
查询分配给用户或组的任务
创建独立运行任务。这些任务与流程实例无关。
手工设置任务的执行者,或者这些用户通过何种方式与任务关联。
认领并完成一个任务。认领意味着一个人期望成为任务的执行者, 即这个用户会完成这个任务。完成意味着“做这个任务要求的事情”。 通常来说会有很多种处理形式。
IdentityService: 管理(创建,更新,删除,查询...)群组和用户
FormService: 一个可选服务,这个服务提供了启动表单和任务表单两个概念
HistoryService: 提供了Activiti引擎的所有历史数据
ManagementService :在使用Activiti的定制环境中基本上不会用到。 它可以查询数据库的表和表的元数据。另外,它提供了查询和管理异步操作的功能。
RepositoryService
获取方式:
//通过activiti.cfg.xml获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
任何与“静态”资源有关的数据(比如流程定义)都可以通过 RepositoryService访问。
从概念上讲,所以静态数据都是Activiti的资源内容。
部署流程文件:
/**当文件部署成功后,会操作数据库中的这三张表
* 发布流程
* 发布流程后,流程文件会保存到数据库中
*/
@Test
public void deployFlow(){
RepositoryService repositoryService = processEngine.getRepositoryService();
//获取在classpath下的流程文件
InputStream in = this.getClass().getClassLoader().getResourceAsStream("myleave.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
//使用deploy方法发布流程
repositoryService.createDeployment()
//通过ZIP方式来部署流程文件
.addZipInputStream(zipInputStream)
//通过输入流来部署流程文件
//.addInputStream("xx.bpmn",inputStream)
//.addInputStream("xx.png", inputStream)
.name("Myleave")//设置流程定义的别名
.deploy();//部署
}
act_re_deployment (部署信息表)
存放流程定义的别名和部署时间
act_re_procdef(流程定义数据表)
存放流程定义的信息,每部署一个新的流程定义都会在这张表中增加一条记录。
如果当KEY相同 也就是 bpmn流程文件的 ID 相同是 增加的记录里面的版本会升级一个版本
act_ge_bytearray(资源文件表)
存放部署后的流程文件
查看流程定义信息:
/**
* 查看流程定义
* 查询act_re_procdef表 流程定义表
*/
@Test
public void queryProcdef(){
RepositoryService repositoryService = processEngine.getRepositoryService();
//创建查询对象
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
//添加查询条件
query.processDefinitionKey("myProcess");//通过key获取
// .processDefinitionName("My process")//通过name获取
// .orderByProcessDefinitionId()//根据ID排序
//.processDefinitionKeyLike(processDefinitionKeyLike)//支持模糊查询
//.listPage(firstResult, maxResults)//分页
//执行查询获取流程定义明细
List<ProcessDefinition> pds = query.list();//获取批量的明细
//.singleResult()//获取单个的明细
for (ProcessDefinition pd : pds) {
System.out.println("ID:"+pd.getId()+",NAME:"+pd.getName()+",KEY:"+pd.getKey()+",VERSION:"+pd.getVersion()+",RESOURCE_NAME:"+pd.getResourceName()+",DGRM_RESOURCE_NAME:"+pd.getDiagramResourceName());
System.out.println("------------------------------------------------");
}
}
运行结果:
ID:myProcess:1:604,NAME:My process,KEY:myProcess,DEPLOYMENT_ID:601,VERSION:1,RESOURCE_NAME:MyLeave.bpmn,DGRM_RESOURCE_NAME:MyLeave.png ------------------------------------------------ ID:myProcess:2:809,NAME:My process,KEY:myProcess,DEPLOYMENT_ID:806,VERSION:2,RESOURCE_NAME:MyLeave.bpmn,DGRM_RESOURCE_NAME:MyLeave.png ------------------------------------------------
显示图片:
通过repositoryService查看流程定义信息,并且获取DEPLOYMENT_ID到 act_ge_bytearray 查询到 资源文件名
通过资源文件名和deploymentId获取流并输出到文件中
/** * 显示图片信息 * @throws IOException */ @Test public void showImg() throws IOException{ String deploymentId = "601"; //通过deploymentId获取资源名称 List<String> names = processEngine.getRepositoryService() .getDeploymentResourceNames(deploymentId); String imgName = null; for (String name : names) { System.out.println("name:"+name); if (name.endsWith(".png")) { imgName = name; } } System.out.println("imgName:"+imgName); if (imgName != null) { File file = new File("e:/"+imgName); //获取资源文件的流 InputStream in = processEngine.getRepositoryService() .getResourceAsStream(deploymentId, imgName); //通过FileUtils将资源文件以流的信息输出到指定文件 FileUtils.copyInputStreamToFile(in, file); } }在E盘下查看 生成的照片
删除流程定义:
/** * 删除流程定义 */ @Test public void delDeployment(){ String deploymentId = "1"; processEngine.getRepositoryService() //普通删除,删除没有在执行的流程,如果流程正在执行,则抛出异常 //.deleteDeployment(deploymentId); //级联删除,不管你在不在运行,会删除当前关联的所有信息,包括在历史表里的数据 .deleteDeployment(deploymentId, true); }
RuntimeService
获取方式:
//通过activiti.cfg.xml获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
启动一个流程实例:
/** * 启动流程实例 */ @Test public void startFlow(){ RuntimeService runtimeService = processEngine.getRuntimeService(); //通过Id来启动一个流程并返回一个流程实例 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess"); System.out.println("id:"+processInstance.getId()+",activitiId:"+processInstance.getActivityId()); }当一个流程实例启动后,会在 act_ru_execution 表中插入一条记录,如果是用户任务节点,同时也会在act_ru_task表中插入一条记录
查询流程状态:
/** * 查看流程状态 */ @Test public void queryState(){ String processInstanceId = "701"; ProcessInstance pi = processEngine.getRuntimeService() //创建执行对象查询,查询正在执行的执行对象 //.createExecutionQuery() .createProcessInstanceQuery()//创建流程实例查询,查询正在执行的流程实例 .processInstanceId(processInstanceId)//通过流程实例ID查询 //返回批量结果 //.list() .singleResult();//返回唯一的结果 if (pi != null) { System.out.println("当前流程:"+pi.getActivityId()); }else { System.out.println("流程已经结束"); } }在整个流程执行的过程中,流程ID 都是 唯一不变的,当流程结束后 流程记录就会在 act_ru_execution 表中被删除,存入到历史表
设置和获取流程变量:
/** * 通过runtimeService设置流程变量 * 设置流程变量 */ public void setAndGetVariables(){ RuntimeService runtimeService = processEngine.getRuntimeService(); //通过执行对象ID和key value设置变量 //value是一个object对象,当一个pojo类实现Serializable接口的时候就可以存入流程变量中 //runtimeService.setVariable(executionId, key, value); //设置专属于一个执行对象ID的流程变量 //runtimeService.setVariableLocal(executionId, key, value); //通过执行对象ID和Map设置多个变量 Map<String, Object> paramMap = new HashMap<String, Object>(); //runtimeService.setVariables(executionId, paramMap); //设置专属于一个执行对象ID的多个流程变量 //runtimeService.setVariablesLocal(executionId, paramMap); //通过执行对象ID获取变量,返回object,需要强转 //runtimeService.getVariable(executionId, key); //通过执行对象ID获取一个Map<String, Object>对象 //runtimeService.getVariables(executionId); }
流程变量所支持的类型
设置的流程变量会存入到act_ru_variable表
act_ru_variable表 的BYTEARRAY_ID_对应的是 act_ge_bytearray 如果是复杂类型的数据 会存入二进制字段中
TaskService
获取方式:
//通过activiti.cfg.xml获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取任务服务对象 TaskService taskService = processEngine.getTaskService();查看个人任务:
/**
* 查看任务
*/
@Test
public void queryTask(){
//获取任务服务对象 TaskService taskService = processEngine.getTaskService();
//根据接受人查询该用户的任务
List<Task> tasks = taskService.createTaskQuery()
//模糊查询
//.taskAssigneeLike(assigneeLike)
//通过执行对象ID查询任务
//.executionId(executionId)
.taskAssignee("张三")//通过接受人来查询个人任务
.list();
for (Task task : tasks) {
System.out.println("ID:"+task.getId()+",姓名:"+task.getName()+",接收人:"+task.getAssignee()+",开始时间:"+task.getCreateTime());
}
}
运行结果
ID:704,姓名:员工请假,接收人:张三,开始时间:Wed Oct 22 17:03:04 CST 2014 ID:804,姓名:员工请假,接收人:张三,开始时间:Thu Oct 23 11:27:47 CST 2014
除了个人任务 还有 组任务
办理任务:
/** * 办理任务 */ @Test public void startTask(){ TaskService taskService = processEngine.getTaskService(); //taskId 就是查询任务中的 ID String taskId = "704"; //完成请假申请任务 taskService.complete(taskId ); }
taskService 和 runtimeService 一样都是可以设置流程变量的
HistoryService
获取方式:
//通过activiti.cfg.xml获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
查询历史任务:
/**结果:
* 查询历史任务
*/
@Test
public void queryHistoryTask(){
String assignee = "张三";
HistoryService historyService = processEngine.getHistoryService();
List<HistoricTaskInstance> htis = historyService.createHistoricTaskInstanceQuery()//创建历史任务查询<span style="font-family: Arial, Helvetica, sans-serif;">对象</span>
//创建一个历史详细信息查询<span style="font-family: Arial, Helvetica, sans-serif;">对象</span>
//.createHistoricDetailQuery()
//创建历史流程实例查询对象
//.createHistoricProcessInstanceQuery()
.taskAssignee(assignee)//根据接受人查询历史任务
.list();//返回批量结果
for (HistoricTaskInstance hti : htis) {
System.out.println("ID:"+hti.getId()+",流程实例ID:"+hti.getProcessInstanceId()+",接收人:"+hti.getAssignee()+",执行对象ID:"+hti.getExecutionId());
System.out.println("------------------------------------------------");
}
}
ID:704,流程实例ID:701,接收人:张三,执行对象ID:701 ------------------------------------------------ ID:804,流程实例ID:801,接收人:张三,执行对象ID:801 ------------------------------------------------
主要是查询act_hi_taskinst表中的数据
查询历史流程实例:
/**结果:
* 查询历史流程实例
*/
@Test
public void queryHistoryPi(){
HistoryService historyService = processEngine.getHistoryService();
String pi = "701";
List<HistoricProcessInstance> hpis = historyService.createHistoricProcessInstanceQuery()//创建历史流程实例查询对象
.processInstanceId(pi)
.list();
for (HistoricProcessInstance hpi : hpis) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("实例ID:"+hpi.getId()+",开始时间:"+sdf.format(hpi.getStartTime())+",结束时间:"+sdf.format(hpi.getEndTime()));
System.out.println("-------------------------------------");
}
}
实例ID:701,开始时间:2014-10-22 17:03:04,结束时间:2014-10-23 15:25:03 -------------------------------------
主要是查询act_hi_procinst表中的数据
获取历史流程变量:
/**
* 获取历史流程变量
*/
@Test
public void getHistoryVariable(){
HistoryService historyService = processEngine.getHistoryService();
List<HistoricVariableInstance> hvis = historyService.createHistoricVariableInstanceQuery()//创建一个历史流程变量实例查询对象
.variableName("key")//通过key查询
.list();
if (hvis != null) {
for (HistoricVariableInstance hvi : hvis) {
System.out.println("key:"+hvi.getVariableName()+",value:"+hvi.getValue());
}
}
}
主要是查询act_hi_varinst表中的数据
查询历史活动信息:
/**结果:
* 查询历史活动信息
* 主要查询的是act_hi_actinst表中的数据
*/
@Test
public void queryHistoryAi(){
String pi = "701";
HistoryService historyService = processEngine.getHistoryService();
List<HistoricActivityInstance> hais = historyService.createHistoricActivityInstanceQuery()//创建历史活动实例查询对象
.processInstanceId(pi)
.list();
for (HistoricActivityInstance hai : hais) {
System.out.println("活动ID:"+hai.getActivityId()+",活动名称:"+hai.getActivityName()+",活动类型:"+hai.getActivityType()+",流程实例ID:"+hai.getProcessInstanceId()+",接收人:"+hai.getAssignee());
System.out.println("--------------------------------");
}
}
活动ID:endevent1,活动名称:End,活动类型:endEvent,流程实例ID:701,接收人:null -------------------------------- 活动ID:startevent1,活动名称:Start,活动类型:startEvent,流程实例ID:701,接收人:null -------------------------------- 活动ID:员工请假,活动名称:员工请假,活动类型:userTask,流程实例ID:701,接收人:张三 -------------------------------- 活动ID:老板审批,活动名称:老板审批,活动类型:userTask,流程实例ID:701,接收人:老板 --------------------------------
这几个是最常用的几个服务.
流程实例和执行对象的区别 流程实例和执行对象 2个是不同的一个概念
相关文章推荐
- activiti入门2流程引擎的API和服务基础
- activiti入门2流程引擎API和服务基础设施
- activiti 流程引擎的API和服务
- 流程引擎的API和服务基础
- Activiti流程引擎的API和服务
- activiti5.20简单介绍(六) -- 流程引擎和流程服务
- Activiti入门教程三(详解流程引擎配置)
- Activiti入门教程九(玩转RuntimeService流程控制API)
- 流程引擎的API和服务
- Activiti入门教程七(玩转存储引擎API)
- 流程引擎的API和服务
- ArcGIS API for Silverlight开发入门(8):在程序中使用Virtual Earth的服务
- Java Servelet API入门基础教程
- 游戏引擎基础(三)(内存使用,特效和API)
- FreeMarker中文帮助手册API文档,基础入门学习文档
- [专家讲座] ArcGIS API for Silverlight开发入门(2):一个基础地图实例(转)
- Java Servelet API入门基础教程
- Java 入门(三) 流程控制 -----程序设计的动态基础
- [专家讲座] ArcGIS API for Silverlight开发入门(2):一个基础地图实例(转)
- WinCE移植流程综述-基础,入门,总结,详细