Activiti用户指南之Activiti的API
一、流程引擎的API和服务(services)
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); RepositoryService repositoryService = processEngine.getRepositoryService(); TaskService taskService = processEngine.getTaskService(); ManagementService managementService = processEngine.getManagementService(); IdentityService identityService = processEngine.getIdentityService(); HistoryService historyService = processEngine.getHistoryService(); FormService formService = processEngine.getFormService();
- 为引擎在部署包和流程定义中提供查询
- 终止或者激活部署包作为整个或者特别的流程定义。终止意味着不能再在部署包和流程定义中进行操作,当然,激活意味着相反的操作。
- 取回各种各样的资源,比如包含部署包或者流程程序的文件。然后这些资源被引擎自动发布。
- 取回一个流程定义的pojo版本,这个版本能被用于用java比xml反省流程。
RepositoryService相当于静态的信息, RuntimeService正好是相反的。它处理一个流程定义中新的流程实例。像上面说的,一个流程定义决定着一个流程中的不同步骤的结构和行为。一个流程实例是这样一个流程定义的的一个执行。对于每一个流程定义,同时会有很多实例在运行。RuntimeService同样是被用在取回和存储流程变量的服务。这些数据是特别是流程实例的,并且这些数据能被用在流程中的各种各样的结构。RuntimeService同样允许在流程实例和executions中去查询。Executions是BPMN 2.0 概念‘token’的一种表现。基本上,一个execution就是一个指向流程实例当前在哪里的指针。最后,任何一个流程实例在等待一个额外的出触发器和流程需要继续的时候,RuntimeService都会被用到。一个流程实例有各种各样的等待状态,并且这个服务对单个实例包含了各种各样的操作。这个实例额外的触发器会被接收到并且这个流程实例会比继续执行。
- 查询分配给人或组的任务
- 创建新的单独任务。这些任务都不跟流程实例有关。
- 操纵哪一个用户的任务被分配或者在一些方式下哪一些用户卷入到任务中。
- 请求或者完成一个任务。请求意味着有些人被分配到到任务,意味着这个人将会完成这个任务。完成意味着正在做任务的某一部分工作。
/** * 当任务被成功执行的时候调用. * @param taskId 是要去完成的任务的ID,不能为空. * @throws ActivitiObjectNotFoundException 当给出的id没有任务存在的时候,会抛出异常. */ void complete(String taskId);
- ActivitiWrongDbException:当Activiti引擎发现在数据库概要和引擎版本不匹配的时候会抛此异常。
- ActivitiOptimisticLockingException:在数据保存的时候,当同时被访问相同数据进入的时候,引起的乐观所。会抛此异常。
- ActivitiClassLoadingException:当一个需要被加载的类没有找打或者正当加载的时候报错,就会抛出此异常。
- ActivitiIllegalArgumentException:
- ActivitiTaskAlreadyClamiedException:当一个任务已经被请求,然后调用taskService.clami(...)的时候,会抛出此异常。
三、工作中用Activiti服务
<?xml version="1.0" encoding="UTF-8" ?> <definitions id="definitions"targetNamespace="http://activiti.org/bpmn20" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:activiti="http://activiti.org/bpmn"><process id="vacationRequest" name="Vacation request"><startEvent id="request" activiti:initiator="employeeName"><extensionElements><activiti:formProperty id="numberOfDays" name="Number of days" type="long" value="1" required="true"/><activiti:formProperty id="startDate" name="First day of holiday (dd-MM-yyy)" datePattern="dd-MM-yyyy hh:mm" type="date" required="true" /><activiti:formProperty id="vacationMotivation" name="Motivation" type="string" /></extensionElements></startEvent><sequenceFlow id="flow1" sourceRef="request" targetRef="handleRequest" /><userTask id="handleRequest" name="Handle vacation request" ><documentation>${employeeName} would like to take ${numberOfDays} day(s) of vacation (Motivation: ${vacationMotivation}).</documentation> <extensionElements><activiti:formProperty id="vacationApproved" name="Do you approve this vacation" type="enum" required="true"><activiti:value id="true" name="Approve" /><activiti:value id="false" name="Reject" /></activiti:formProperty><activiti:formProperty id="managerMotivation" name="Motivation" type="string" /></extensionElements><potentialOwner><resourceAssignmentExpression><formalExpression>management</formalExpression></resourceAssignmentExpression></potentialOwner> </userTask><sequenceFlow id="flow2" sourceRef="handleRequest" targetRef="requestApprovedDecision" /><exclusiveGateway id="requestApprovedDecision" name="Request approved?" /><sequenceFlow id="flow3" sourceRef="requestApprovedDecision" targetRef="sendApprovalMail"><conditionExpression xsi:type="tFormalExpression">${vacationApproved == 'true'}</conditionExpression></sequenceFlow><task id="sendApprovalMail" name="Send confirmation e-mail" /><sequenceFlow id="flow4" sourceRef="sendApprovalMail" targetRef="theEnd1" /><endEvent id="theEnd1" /><sequenceFlow id="flow5" sourceRef="requestApprovedDecision" targetRef="adjustVacationRequestTask"><conditionExpression xsi:type="tFormalExpression">${vacationApproved == 'false'}</conditionExpression></sequenceFlow><userTask id="adjustVacationRequestTask" name="Adjust vacation request"><documentation>Your manager has disapproved your vacation request for ${numberOfDays} days.Reason: ${managerMotivation}</documentation><extensionElements><activiti:formProperty id="numberOfDays" name="Number of days" value="${numberOfDays}" type="long" required="true"/><activiti:formProperty id="startDate" name="First day of holiday (dd-MM-yyy)" value="${startDate}" datePattern="dd-MM-yyyy hh:mm" type="date" required="true" /><activiti:formProperty id="vacationMotivation" name="Motivation" value="${vacationMotivation}" type="string" /><activiti:formProperty id="resendRequest" name="Resend vacation request to manager?" type="enum" required="true"><activiti:value id="true" name="Yes" /><activiti:value id="false" name="No" /></activiti:formProperty></extensionElements><humanPerformer><resourceAssignmentExpression><formalExpression>${employeeName}</formalExpression></resourceAssignmentExpression></humanPerformer> </userTask><sequenceFlow id="flow6" sourceRef="adjustVacationRequestTask" targetRef="resendRequestDecision" /><exclusiveGateway id="resendRequestDecision" name="Resend request?" /><sequenceFlow id="flow7" sourceRef="resendRequestDecision" targetRef="handleRequest"><conditionExpression xsi:type="tFormalExpression">${resendRequest == 'true'}</conditionExpression></sequenceFlow><sequenceFlow id="flow8" sourceRef="resendRequestDecision" targetRef="theEnd2"><conditionExpression xsi:type="tFormalExpression">${resendRequest == 'false'}</conditionExpression></sequenceFlow><endEvent id="theEnd2" /></process></definitions> |
Map<String, Object> variables = new HashMap<String, Object>(); variables.put("employeeName", "Kermit"); variables.put("numberOfDays", new Integer(4)); variables.put("vacationMotivation", "I'm really tired!"); RuntimeService runtimeService = processEngine.getRuntimeService(); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vacationRequest", variables); // Verify that we started a new process instance Log.info("Number of process instances: " + runtimeService.createProcessInstanceQuery().count());
// Fetch all tasks for the management group TaskService taskService = processEngine.getTaskService(); List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("management").list(); for (Task task : tasks) { Log.info("Task available: " + task.getName());}
Task task = tasks.get(0); Map<String, Object> taskVariables = new HashMap<String, Object>(); taskVariables.put("vacationApproved", "false"); taskVariables.put("managerMotivation", "We have a tight deadline!"); taskService.complete(task.getId(), taskVariables);
repositoryService.suspendProcessDefinitionByKey("vacationRequest"); try { runtimeService.startProcessInstanceByKey("vacationRequest"); } catch (ActivitiException e) { e.printStackTrace(); }
List<Task> tasks = taskService.createTaskQuery().taskAssignee("kermit").processVariableValueEquals("orderId", "0815").orderByDueDate().asc().list();
有时,你需要更强大的查询,用一个OR操作或者约束的查询,用API,你不能明确的实现。对于这种情况,我们介绍本地查询,本地查询允许你写自己的SQL查询.返回类型被你用的查询对象定义,并且数据会被映射到正确的对象.如认为,流程实例...因此,你不得不用在数据库中定义的表和字段的名字作为被映射到数据库的查询。这需要一些关于数据结构的知识,并且它推荐给我们要小心的进行本地查询。表的名字能通过API被重新寻回,以致于尽可能的远离对它的依赖。
List<Task> tasks = taskService.createNativeTaskQuery().sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) + " T WHERE T.NAME_ = #{taskName}").parameter("taskName", "gonzoTask").list();long count = taskService.createNativeTaskQuery().sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) + " T1, "+ managementService.getTableName(VariableInstanceEntity.class) + " V1 WHERE V1.TASK_ID_ = T1.ID_").count();
- 值表达式:值得解析。默认的,所有的进程变量都能被拿来用。所有的spring-beans也能拿来用在表达式中。下面是例子:方法表达式:引用一个有或者没有参数的方法。 当引用一个没有参数的方法的时候,在方法名字的后面要确定去添加一个空的括号。传过来的参数可以是被他们自己解析的字符串或者表达式。举例:
${myVar} ${myBean.myProperty}
${printer.print()} ${myBean.addNewOrder('orderName')} ${myBean.doSomething(myVar, execution)}
这些表达式支持解析实体类、集合、数组和map。
- execution:
- task:
- authenticatedUserId:
六、在一个web应用中的流程引擎
public class ProcessEnginesServletContextListener implements ServletContextListener {public void contextInitialized(ServletContextEvent servletContextEvent) {ProcessEngines.init();}public void contextDestroyed(ServletContextEvent servletContextEvent) {ProcessEngines.destroy();}}
ProcessEngines.getDefaultProcessEngine()
or
ProcessEngines.getProcessEngine("myName");
当然,用任何一个创建流程引擎的变体方法中也是可能的。想配置信息中描述的那样。contextDestryed方法会委托ProcessEngines.destroy()。这样,所有初始化的流程引擎都会关闭。
Activiti用户指南之Activiti的API相关推荐
- python activiti bpmn_Activiti 用户指南(BPMN 2.0介绍)
BPMN 2.0介绍 定义流程 创建一个新的XML文件并为其命名,确保文件以.bpmn20.xml或.bpmn结尾,否则引擎将不会选择该文件进行部署. BPMN 2.0模式的根元素是definitio ...
- 阿里云API网关(6)用户指南(开放 API )
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- activiti自定义_在Activiti中执行自定义查询
activiti自定义 (这可能最终会出现在Activiti 5.15版本的用户指南中,但是我已经想要共享它了) Activiti API允许使用高级API与数据库进行交互. 例如,对于检索数据,查询 ...
- jBPM3.12用户指南中文翻译----第一章 绪论
这是Jboss 的jBPM3.12框架的用户指南的中文翻译.其中第一章的译文,是我在网上找到的.其他几章都是我自己做的翻译.我的翻译是中英文对照,只翻译部分我认为重要的,不翻译简单的英文,以免浪费你我 ...
- [转载]Guice 1.0 用户指南
http://code.google.com/p/google-guice/ 用 Guice 写 Java Guice 1.0 用户指南 (20070326 王咏刚 译自:http://docs.go ...
- gradle插件用户指南(翻译)
gradle插件用户指南(翻译) http://www.open-open.com/lib/view/open1428320744713.html gradle属性文件详解(英文): https:// ...
- 《Jersey用户指南》翻译邀请
7月并发网组织大家翻译<Jersey用户指南>.有兴趣的同学可以通过评论领取,翻译完成之后再并发网直接提交审核. 一次领取一篇,一篇建议领取一个章节,翻译完成之后可以继续领取,领取文章后最 ...
- Guice 1.0 用户指南
http://code.google.com/p/google-guice/ 用 Guice 写 Java Guice 1.0 用户指南 (20070326 王咏刚 译自:http://docs.go ...
- Gradle用户指南(1)-Gradle安装
前置条件 Gradle 需要 Java JDK 或者 JRE,版本是 6 及以上.Gradle 将会装载自己的 Groovy 库,因此,Groovy 不需要被安装.任何存在的 Groovy 安装都会被 ...
最新文章
- gcc for Windows 开发环境介绍
- REST资源何时应获得其自己的地址?
- 区块链相关问题 理解
- Android 基本开发规范(必读)
- Qt 的udpSocket通信
- 电子工程 计算机科学,计算机科学、计算机工程和电子工程有啥区别
- mysql 事件的作用_MySQL 事件
- bzoj 3359: [Usaco2004 Jan]矩形(DP)
- 【数组】Triangle
- smartsvn 忽略文件夹_Smart SVN-使用Smart SVN 管理项目代码文件(在windows上)
- topcoder使用
- ubuntu mysql-admin_ubuntu 14.04中安装phpadmin即mysql图形管理界面
- ZBrush中的皮肤纹理该怎么添加
- Unraid使用记录:使用Docker与虚拟机
- 一览生信分析的各种工作环境—Linux子系统、双系统、虚拟机和Docker
- 复盘港股2021:新股上市热潮不减,市场重现“冰火两重天”
- 报数游戏1-3循环报数,报到3的人退出,求原来的序号
- 生活小发现------联想锁屏壁纸找不到??
- C++程序设计:原理与实践(进阶篇)16.3 通用搜索算法f?ind_if()
- 计算机二级C语言考试Tips
热门文章
- LeetCode Min Stack 最小值栈
- Function spec
- 再读《精通css》00
- Java学科课程大纲
- SpringMVC-动力节点-王鹤
- vscode 不展示文档注释内容_文本框这样用,实现文档不同板块内容高效联动,你还不知道吧...
- 开启服务_Nike Dunk 开启定制服务
- 下载丨Linux+Oracle 11g+RAC+12cc+adg国内业界最详细生产系统下实施文档
- 云端之战:Google Cloud 的多云战略和甲骨文的数据库云
- 未完待续:关于DB Link和SCN,你还需要知道的是...