学 习 笔 记
目录
Activiti的持久化方式 .................................................................................................................................................. 3 数据库............................................................................................................................................................................... 3 名词解释........................................................................................................................................................................... 4 关键对象....................................................................................................................................................................... 4 服务接口....................................................................................................................................................................... 4 Activiti 使用 ..................................................................................................................................................................... 4 启动流程引擎容器: ................................................................................................................................................... 4 流程定义....................................................................................................................................................................... 5 配置文件....................................................................................................................................................................... 6 结合Spring .................................................................................................................................................................. 6 创建流程引擎 ............................................................................................................................................................... 7 部署流程....................................................................................................................................................................... 7 启动流程....................................................................................................................................................................... 8 任务分配....................................................................................................................................................................... 8 查询任务....................................................................................................................................................................... 8 领取任务....................................................................................................................................................................... 8 完成任务....................................................................................................................................................................... 8 查询................................................................................................................................................................................... 9 流程部署查询 ............................................................................................................................................................... 9 流程定义查询 ............................................................................................................................................................... 9 处理中的流程实例查询 ............................................................................................................................................... 9 处理完成的流程实例查询 ........................................................................................................................................... 9 流程处理记录查询 ....................................................................................................................................................... 9 常用的节点 ..................................................................................................................................................................... 10 Start events ................................................................................................................................................................ 10 Timer start event ....................................................................................................................................................... 10 Sequence flow ............................................................................................................................................................ 10 Gateways .................................................................................................................................................................... 11 User task ..................................................................................................................................................................... 11 Script Task ................................................................................................................................................................. 12 Java Service Task ....................................................................................................................................................... 12 工作流控制类代码: ..................................................................................................................................................... 12
Activiti的持久化方式
Activiti使用Mybatis3 做持久化工作,可以在配置中设置流程引擎启动时创建表。 Activiti使用到的表都是ACT_开头的。 ACT_RE_*:流程定义存储。
ACT_RU_*:流程执行记录,记录流程启动到结束的所有动作,流程结束后会清除相关记录。 ACT_ID_*:用户记录,流程中使用到的用户和组。 ACT_HI_*:流程执行的历史记录。 ACT_GE_*:通用数据及设置。 使用到的表:
ACT_GE_BYTEARRAY:流程部署的数据。 ACT_GE_PROPERTY:通用设置。 ACT_HI_ACTINST:流程活动的实例。 ACT_HI_ATTACHMENT: ACT_HI_COMMENT: ACT_HI_DETAIL:
ACT_HI_PROCINST:流程实例。 ACT_HI_TASKINST:任务实例。 ACT_ID_GROUP:用户组。 ACT_ID_INFO:
ACT_ID_MEMBERSHIP: ACT_ID_USER:用户。
ACT_RE_DEPLOYMENT:部署记录。 ACT_RE_PROCDEF:流程定义。
ACT_RU_EXECUTION:流程执行记录。 ACT_RU_IDENTITYLINK: ACT_RU_JOB:
ACT_RU_TASK:执行的任务记录。
ACT_RU_VARIABLE:执行中的变量记录。
数据库
Activiti支持的数据库
Activiti database type Versions tested Notes
h2 1.2.132 Default configured database mysql 5.1.11 oracle 10.2.0 postgres 8.4
db2 DB2 9.7 using db2jcc4 [EXPERIMENTAL] mssql 2008 using JDBC jtds-1.2.4 [EXPERIMENTAL]
名词解释
关键对象
processEngine:流程引擎对象
Deployment:流程部署对象,部署一个流程时创建。 ProcessDefinitions:流程定义,部署成功后自动创建。 ProcessInstances:流程实例,启动流程时创建。
Task:任务,在Activiti 中的Task仅指有角色参与的任务,即定义中的UserTask。
Execution:执行计划,流程实例和流程执行中的所有节点都是Execution,如UserTask、ServiceTask 等。
服务接口
ProcessEngine:流程引擎接口,提供流程管理和运作的所有接口。
RuntimeService:运行时服务接口,提供流程启动服务,运行中流程查询,运行变量设置和获取。
TaskService:用户任务接口(UserTask),提供运行时任务查询、领取、完成、删除及变量设置用户管理等服 务。
IdentityService:用户和组管理接口。
ManagementService:流程引擎管理接口。
HistoryService:流程处理查询接口,包括执行中流程查询和历史流程查询。
Activiti 使用
启动流程引擎容器:
org.activiti.engine包下为ProcessEngines的抽象类,我把它看做作流程引擎的容器,它持有所有注册在案流程引擎实例。
init和destory方法定义了它的生命周期。
init负责加载类路径下的名为activiti.cfg.xml或activiti-context.xml的资源文件,并用俩种不同的方式来初始化资源文件中所配置的流程引擎。
(1)普通(activiti.cfg.xml):initProcessEnginFromResource(resource) 注:这是个私有方法
调用关系:initProcessEnginFromResource---》buildProcessEngine---》ProcessEngineConfiguration.buildProcessEngine
真正干活(创建流程实例的)的是ProcessEngine类的buildProcessEngine
流程定义
流程图如下:
在activiti的插件中画图完成后用xml打开流程图会自动生成配置文件 流程定义如下:
xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"> Write monthly financial report for publication to shareholders. Verify monthly financial report composed by the accountancy department. This financial report is going to be sent to all the company shareholders.
配置文件
默认文件名称:activiti.cfg.xml,放在classpath 下。 内容如下:
结合Spring
Spring中定义数据连接及事务管理
定义Activiti配置
定义流程引擎
定义流程中使用的对象
创建流程引擎
根据默认的配置文件创建默认的流程引擎。用来管理装载所有的流程 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
也可以通过代码由ProcessEngineConfiguration 创建一个流程引擎,这种方式不需要配置文件,可以在 ProcessEngineConfiguration 中设置配置文件中有的所有参数。
ProcessEngine processEngine = ProcessEngineConfiguration .createProcessEngineConfigurationFromResourceDefault() .setMailServerHost(\"gmail.com\") .setJdbcUsername(\"mickey\") .setJdbcPassword(\"mouse\") .buildProcessEngine();
由Spring创建流程引擎。见结合Spring
部署流程
RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deployment = repositoryService.createDeployment()
.addClasspathResource(\"FinancialReportProcess.bpmn20.xml\") // 此为直接部署流程配置文件 .deploy();
还可以通过字符串,zip 包,inputStream等方式部署流程。
启动流程
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(\"financialReport\");
启动流程使用流程定义中的process id=\"financialReport\",可以绑定一个String 类型的businessKey和
Map 类型的流程变量集合
任务分配
assignee为动态分配任务给角色\"${xiaoshou}\"为从变量表ACT_RU_VARIABLE:中取得的名为xiaoshou的值。 也可以activiti:assignee=\"ZQQ\".直接进行任务分配 然后根据task.getAssignee()是否有值进行判断任务是否已被分配 查询任务 流程定义中,第一个任务是指定accountancy角色处理的。 TaskService taskService = processEngine.getTaskService(); 查询流转到accountancy 的任务 List 领取任务 如果fozzie 是accountancy下的一个用户 for (Task task : tasks) { // fozzie领取任务 taskService.claim(task.getId(), \"fozzie\"); } 完成任务 查询用户fozzie 可处理的任务 tasks = taskService.createTaskQuery().taskAssignee(\"fozzie\").list(); for (Task task : tasks) { //完成任务 taskService.complete(task.getId()); } 查询 流程部署查询 DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery(); List 流程定义查询 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); List 处理中的流程实例查询 RuntimeService runtimeService = processEngine.getRuntimeService(); List 处理完成的流程实例查询 HistoricProcessInstanceQuery historicProcessInstanceQuery = processEngine.getHistoryService() .createHistoricProcessInstanceQuery(); List historicProcessInstanceQuery.finished().orderByProcessInstanceStartTime().asc().list(); 流程处理记录查询 仅得到流程中的UserTask节点 HistoricTaskInstanceQuery historicTaskInstanceQuery = processEngine.getHistoryService() .createHistoricTaskInstanceQuery(); List historicActivityInstanceQuery=processEngine.getHistoryService().createHistoricActivityInstanceQuery(); List historicActivityInstanceQuery.processInstanceId(processInstanceId).orderByHistoricActivityInstanceStartTime(). asc().list(); 常用的节点 Start events 流程的开始,必须。 Timer start event 用于定时启动的流程,可定时启动一次,或按时重复启动流程。 定时启动一次的流程: 重复启动的流程: 时间格式定义参照ISO8601。 R4:重复4 次。 2011-03-11T12:13:00:启动的时间。 P:重复。 T5M:每5分钟,T表示时间,5M是5分钟,05S是5 秒。 Sequence flow 顺序流 描述当前的节点(开始事件,任务,子流程、结束事件等)完成后流转到哪里。 有条件的顺序流 当前节点在满足定义条件后的流转方向。 默认的顺序流 用于关口(Gateway)之后,和条件顺序流同时存在,不满足所有条件的时候流转去哪里。 Gateways Exclusive gateway 互斥关口,流程经过关口后只会走一个顺序流,即使关口后的顺序流都是无条件的。 Parallel Gateway 并行关口,用在开头,流程经过关口后会同时经过所有顺序流,用在结尾,所有流程完成后会一起通过并行 关口。 User task 人工任务,必须要有人或人的组参与。 Script Task 脚本任务,可以执行一段脚本,Javascript,grove都可以使用,可以在脚本中定义或修改变量,来控制流程的 流转。 Java Service Task 工作流控制类代码: publicclass WorkFlowManager { private ProcessEngine processEngine; public WorkFlowManager() { ProcessEngineConfiguration configuration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(\"activiti.cfg.xml\");//这个也可以用,指定配置文件路径 /** * 部署流程 } //ProcessEngineConfiguration configuration = processEngine=configuration.buildProcessEngine(); //processEngine = ProcessEngines.getDefaultProcessEngine(); ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); * @param in 文件输出流 * @param deployName 部署名称 * @param fileName 文件名称 * @throws IOException */ publicvoid deployProcess(InputStream in,String deployName,String fileName) throws IOException{ RepositoryService repositoryService = processEngine.getRepositoryService(); DeploymentBuilder deploymentBuilder = repositoryService .createDeployment() .enableDuplicateFiltering() .name(deployName); } /** * 查询流程部署信息 * @return返回所有已部署的流程。 */ public List * 查询部署的流程定义。 * @return返回所有已部署的流程定义。 */ public List List if ( fileName.endsWith(\".bar\") || fileName.endsWith(\".zip\") || fileName.endsWith(\".jar\") ) { deploymentBuilder.addZipInputStream(new ZipInputStream(in)); } else { deploymentBuilder.addInputStream(fileName, in); } deploymentBuilder.deploy(); processEngine.getRepositoryService().createDeploymentQuery().orderByDeploymenTime().asc().list(); processEngine.getRepositoryService().createProcessDefinitionQuery().orderByProcessDefinitionId().asc().list(); } /** * 查询运行的流程实例 * @param processDefinitionId 流程定义id * @return这个流程定义产生的流程实例 */ public List return list; List processEngine.getRuntimeService().createProcessInstanceQuery().processDefinitionId(processDefinitionId).orderByProcessDefinitionId().asc().list(); } /** * 删除部署的流程 * @param deployId 部署流程的id */ publicvoid deleteProcessDeploy(String deployId){ } /** * 启动流程 * @param DefinitionId 流程定义id * @param businessKey 业务组件id * @param var 流程变量 * @return启动的流程实例id */ public String startProcess(String DefinitionId,Map //查询任务数量 public List * 删除流程实例 * @param insId 流程实例id List return taskList; taskList = processEngine.getTaskService().createTaskQuery().taskAssignee(assignee) .list(); System.out.println(\"流程启动\"); ProcessInstance processInstance = processEngine.getRuntimeService() .startProcessInstanceById(DefinitionId,var); return processInstance.getId(); processEngine.getRepositoryService().deleteDeployment(deployId,true); List System.out.println(\"@@@@\"+pi.getId()); return list; processEngine.getRuntimeService().createProcessInstanceQuery().list(); (); */ publicvoid deleteProcessInstance(String insId){ } /** * 获取流程定义图片 * @param defId 流程定义id * @return返回流程定义图片文件的读取流 */ public InputStream getProcessDefinitionImg(String defId){ } /** * 查看流程是否结束 * @param processsInstanceId 流程定义id * @return true,流程结束。false,流程未结束。 */ publicboolean processIsEnded(String processsInstanceId){ List String diagramResourceName=pdef.getDiagramResourceName(); InputStream resourceAsStream = return resourceAsStream; processEngine.getRuntimeService().deleteProcessInstance(insId, null); List processEngine.getHistoryService().deleteHistoricProcessInstance(insId); processEngine.getHistoryService().deleteHistoricTaskInstance(hti.getId()); processEngine.getHistoryService().createHistoricTaskInstanceQuery().processInstanceId(insId).list(); processEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionId(defId).list(); processEngine.getRepositoryService().getResourceAsStream(pdef.getDeploymentId(), diagramResourceName); processEngine.getRuntimeService().createProcessInstanceQuery().processInstanceId(processsInstanceId).list } /** * 查找当前流程的任务名称 * @param proInsId 流程实例id * @return当前流程实例中可执行的任务。未找到返回null。 */ public Task findCurrentTask(String proInsId){ List ProcessInstance processInstance = list2.get(0); return list.size()>0? false:true; processEngine.getRuntimeService().createProcessInstanceQuery().processInstanceId(proInsId).list(); ; } /** } if(!processInstance.isEnded()){ } List Task task = list.get(0); return task; processEngine.getTaskService().createTaskQuery().processInstanceId(proInsId).list(); returnnull; * 删除已部署的所有流程 */ publicvoid delProcessDeploy(){ } /** * 返回一个用户的任务列表对应的流程实例列表 * @param user 用户名 * @return流程实例id列表 */ public List List List processEngine.getRepositoryService().deleteDeployment(pp.getId()); processEngine.getTaskService().createTaskQuery().taskAssignee(user).orderByTaskCreateTime().desc().list() } /** * 返回一个流程的变量 * @param processInstanceId 流程实例id * @return流程实例变量 */ public Map * 设置一个流程的变量 * @param processInstanceId 流程实例id * @param varName 变量名 returnprocessEngine.getTaskService().getVariables(processInstanceId); for(Task t:list){ } return insList; insList.add(t.getProcessInstanceId()); * @param varValue 变量值 */ publicvoid setProcessVariable(String processInstanceId,String varName,Object varValue){ } /** * 根据流程定义id找到form文件位置并返回 * @param proDefId 流程定义id * @return流程定义中start节点的form key。未找到返回null */ public String findFormByProcessDefinitionId(String proDefId){ } /** * 根据任务id找到配置的form文件位置并返回 * @param taskId 任务id * @return流程实例中任务节点的form key。未找到返回null */ public String findFormByTaskId(String taskId){ } /** * 根据任务id找到流程定义文件中task对应的DefinitionKey * @param taskId 任务id * @return task对应的DefinitionKey。未找到返回null */ public String findTaskKeyByTaskId(String taskId){ } /** * 完成任务 * @param taskId 任务id */ publicvoid completeTask(String taskId){ } //以下方法测试使用 publicvoid deployIdentity(){ IdentityService identityService = processEngine.getIdentityService(); Task singleResult = processEngine.getTaskService(). createTaskQuery().taskId(taskId).singleResult(); processEngine.getTaskService().complete(singleResult.getId()); Task singleResult = return singleResult.getTaskDefinitionKey(); String formKey = processEngine.getFormService().getTaskFormData(taskId).getFormKey(); return formKey; String formKey = processEngine.getFormService().getStartFormData(proDefId).getFormKey(); return formKey; processEngine.getRuntimeService().setVariable(processInstanceId, varName, varValue); processEngine.getTaskService().createTaskQuery().taskId(taskId).singleResult(); } } identityService.saveUser(identityService.newUser(\"zz\")); identityService.saveUser(identityService.newUser(\"xx\")); identityService.saveUser(identityService.newUser(\"cc\")); publicvoid unDeployIdentity(){ } processEngine.getIdentityService().deleteUser(\"zz\"); processEngine.getIdentityService().deleteUser(\"xx\"); processEngine.getIdentityService().deleteUser(\"cc\");
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务