Camunda/Activiti API

3,251 阅读9分钟

RepositoryService

  • 管理流程定义文件xml及静态资源的服务

  • 对特定流程的暂停和激活

  • 流程定义启动权限管理

  • 类内部重要的成员有

  • deploymentBuilder 部署文件构造器

  • deploymentQuery 部署文件查询器

  • ProcessDefinitionQuery 流程定义文件查询对象

  • Deployment 流程部署文件对象

  • ProcessDefinition 流程定义文件对象

  • BpmnModel 流程定义的java格式

/** 获取DeploymentBuilder,用于部署流程,一次可以部署多个流程,常与deploy()方法连用 */
DeploymentBuilder createDeployment();

	repositoryService.createDeployment()
                .name("xxx") //部署文件名称
                .source("xxx") 
                .addString("processes/script_task.bpmn", text) //添加流程文件
                .deploy();  //deploy后就会将当前部署对象和相关资源文件的内容保存到数据库中

/** 根据id删除部署对象*/
void deleteDeployment(String deploymentId);

/**
  * 删除部署对象
  * cascade为true时,级联删除流程实例,历史流程实例
  */
void deleteDeployment(String deploymentId, boolean cascade);

/**
  * 删除部署对象
  * cascade为true时,级联删除流程实例,历史流程实例
  * skipCustomListeners 为true时,不被自定义监听器监听
  */
void deleteDeployment(String deploymentId, boolean cascade,
                      boolean skipCustomListeners);

/** 删除属于给定进程定义id的进程定义 */
void deleteProcessDefinition(String processDefinitionId);

/** 删除属于给定进程定义id的进程定义,cascade为true,级联删除流程实例 */
void deleteProcessDefinition(String processDefinitionId, boolean cascade);

/** 检索给定部署对象的部署资源名称列表,按首字母排序*/
List<String> getDeploymentResourceNames(String deploymentId);

/** 检索给定部署对象的部署资源列表,按名字的字母顺序排列。*/
List<Resource> getDeploymentResources(String deploymentId);

/** 获取指定部署对象的指定(name)部署资源的字节流文件 */
InputStream getResourceAsStream(String deploymentId, String resourceName);

/** 获取指定部署对象的指定(id)部署资源的字节流文件 */
InputStream getResourceAsStreamById(String deploymentId, String resourceId);

/** 获取DeploymentQuery对象,支持根据各种条件的查询(部署对象)*/
DeploymentQuery createDeploymentQuery();

/** 获取流程定义查询对象,支持根据各种条件的查询(流程定义)*/
ProcessDefinitionQuery createProcessDefinitionQuery();

/** 通过id挂起流程定义,如果流程定义被挂起了,则无法通过该流程定义启动新的流程实例 */
void suspendProcessDefinitionById(String processDefinitionId);

/** 通过processDefinitionId挂起流程定义, 
  * suspendProcessInstances为true时,同时挂起基于该流程定义的流程实例
  * suspensionDate 指定挂起的时间,为null时表示立即挂起
  */
void suspendProcessDefinitionById(String processDefinitionId,
                                  boolean suspendProcessInstances, 
                                  Date suspensionDate);

/** 同suspendProcessDefinitionById */
void suspendProcessDefinitionByKey(String processDefinitionKey);

/** 同suspendProcessDefinitionById */
void suspendProcessDefinitionByKey(String processDefinitionKey, 
                                   boolean suspendProcessInstances, 
                                   Date suspensionDate);

/** 通过processDefinitionId激活流程定义 */
void activateProcessDefinitionById(String processDefinitionId);

/** 通过processDefinitionId激活流程定义, 
  * activateProcessInstances,同时激活基于该流程定义的流程实例
  * activationDate 指定挂起的时间,为null时表示立即激活
  */
void activateProcessDefinitionById(String processDefinitionId, 
                                   boolean activateProcessInstances,
                                   Date activationDate);

/** 同activateProcessDefinitionById */
void activateProcessDefinitionByKey(String processDefinitionKey);

/** 同activateProcessDefinitionById */
void activateProcessDefinitionByKey(String processDefinitionKey, 
                                    boolean activateProcessInstances, 
                                    Date activationDate);
/** 通过UpdateProcessDefinitionSuspensionStateSelectBuilder的方法激活或者挂起流程定义 
  * UpdateProcessDefinitionSuspensionStateSelectBuilder.by..();
  */
UpdateProcessDefinitionSuspensionStateSelectBuilder updateProcessDefinitionSuspensionState();

/** 更新流程定义的生存时间 
  * 该字段用于历史记录清理进程中
  */
void updateProcessDefinitionHistoryTimeToLive(String processDefinitionId, 
                                               Integer historyTimeToLive);
 
/** 通过processDefinitionId得到已部署的流程模型的字节流,如BPMN 2.0 xml文件 */
InputStream getProcessModel(String processDefinitionId);

/** 通过processDefinitionId得到已部署的流程图的字节流,如PNG图像 */
InputStream getProcessDiagram(String processDefinitionId);

/** 根据id获取流程定义信息 */
ProcessDefinition getProcessDefinition(String processDefinitionId);
DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();

DeploymentQuery常用api

interface DeploymentQuery extends Query<DeploymentQuery, Deployment> {
      /**根据部署对象ID得到部署对象 */
      DeploymentQuery deploymentId(String deploymentId);

      /** 根据部署对象name得到部署对象 */
      DeploymentQuery deploymentName(String name);

      /** 模糊查询. */
      DeploymentQuery deploymentNameLike(String nameLike);

      /** 在某个时间前 */
      DeploymentQuery deploymentBefore(Date before);

      /** 在某个时间后 */
      DeploymentQuery deploymentAfter(Date after);

      /** 按照部署对象id排序 可在方法后指定正序还是倒序*/
      DeploymentQuery orderByDeploymentId();
    
      /** extend Query  */
      asc();
      desc();
      long count();    // 对查询结果计数
      singleResult();  // 查询单条结果
      List<U> list();  // 查询列表
      List<U> listPage(int firstResult, int maxResults); // 查询分页列表
}


RuntimeService

  • 启动流程及对流程数据的控制
  • 流程实例(ProcessInstance)与执行流(Execution)的查询
  • 触发流程操作,接收消息和信号
// 根据ProcessInstanceBuilder启动流程实例
ProcessInstanceBuilder bulider = runtimeService.createProcessInstanceBuilder();
bulider.businessKey("second_approve")
                .processDefinitionKey("")
                .variables(variables)
                .start();
/** 启动流程实例的常用方法: id、key、message */
  ProcessInstanceQuery processInstanceId(String processInstanceId);

/** 通过key启动的流程实例每次都是根据最新版本的流程定义启动的,比使用流程定义id启动更加方便。 */
  startProcessInstanceByKey(String processDefinitionKey);     

  startProcessInstanceByMessage(String messageName);

/** 启动实例时可以带上参数 */

startProcessInstanceById(String processDefinitionId, Map<String, Object> variables);

/** 可以在流程启动后获取变量 */

getVariables(processInstance.getId());

/** 给现有的流程实例设置变量*/

setVariable(processInstance.getId(),"key","value");

/** 查询流程实例对象 */
ProcessInstanceQuery createProcessInstanceQuery()/** 查询状态为挂起的所有流程定义 */
  ProcessInstanceQuery suspended();

/** 查询状态为激活的所有流程定义 */
  ProcessInstanceQuery active();

/** 查询至少有一个事件的流程定义 */
  ProcessInstanceQuery withIncident();

/** 只查询顶级流程实例 */
  ProcessInstanceQuery rootProcessInstances();

/** 只选择没有子流程的流程实例 */
  ProcessInstanceQuery leafProcessInstances();

TaskService

  • 对用户任务UserTask的管理和流程的控制

  • 设置用户任务的权限信息(设置候选人等)

  • 针对用户任务添加任务附件,任务评论和事件记录

    Assignee: 受让人,受理人 执行任务的人

    Owner:委托人,受理人将任务委托给其他人时,受理人就成了Owner,其他人就成了Assignee

/** 保存任务到数据库,如果任务已存在则更新任务 */
void saveTask(Task task);

/** 删除任务,但不删除和该任务相关的历史信息 */
void deleteTask(String taskId);

/** 批量删除任务,但不删除和该任务相关的历史信息 */
void deleteTasks(Collection<String> taskIds);

/** 删除任务,并根据cascade的值来决定是否级联删除与该任务相关的任务 */
void deleteTask(String taskId, boolean cascade);

/** 如果任务是启用的,将删除原因记录在历史信息中 */
void deleteTask(String taskId, String deleteReason);

/** 签收任务
  * 将userId对应的用户 作为任务的受让人(Assignee)
  * 与setAssignee()不同的是,当前任务已经有受让人,会进行检查
  * 任务不存在或者任务已被其他人员声明时,抛出ProcessEngineException
  */
void claim(String taskId, String userId);

/** 将任务的受让人修改为 userId对应的用户 */
void setAssignee(String taskId, String userId);

/** 将任务的所有权移交给 userId对应的用户 */
void setOwner(String taskId, String userId);

/** 
  * 委派任务给 userId 对应的用户
  * 当前任务已经有受让人
  * 而且任务状态为DelegationState.PENDING(任务正在协办)
  * 如果任务没有所有者,则将所有者设为任务的受让人
  * 受让人使用resolveTask(String taskId) 向任务所有者汇报
  * 只有任务所有者(owner)能调用complete
  */
void delegateTask(String taskId, String userId);

/** 
  * 将任务标记为已完成
  * 如果是通过delegateTask()委托的任务,可以通知任务的所有人
  * 任务状态为DelegationState.PENDING(任务正在协办)才能调用
  * 方法返回后任务状态变成DelegationState.RESOLVED
  * 此时任务可以调用complete()
  */
void resolveTask(String taskId);

/** 完成任务 */
void complete(String taskId);

 /**
   * 完成任务,paramsMap 任务携带变量
   */
void complete(String taskId, Map<String, Object> paramsMap);

/** 获取任务的IdentityLink -> 任务、受让人、组、租户的关联信息 */
List<IdentityLink> getIdentityLinksForTask(String taskId);

/** 修改任务的优先级,只有任务所有者或者管理员能够修改 */
void setPriority(String taskId, int priority);

/** 设置全局变量 全局可用,同一key值被后面相同的key值覆盖*/
void setVariable(String taskId, String variableName, Object value);

/** 设置局部变量,作用域只限于当前任务节点内 */
void setVariableLocal(String taskId, String variableName, Object value);

/** 向任务或流程实例添加注释,并返回注释 */
Comment createComment(String taskId, String processInstanceId, String message);

/** 添加任务附件 */
Attachment createAttachment(String attachmentType, String taskId, 
                            String processInstanceId, String attachmentName,
                            String attachmentDescription, String url);
/** 更新附件信息 */
void saveAttachment(Attachment attachment);

/** 列出该父任务的子任务列表 */
List<Task> getSubTasks(String parentTaskId);

/** 创建任务报告 */
TaskReport createTaskReport();

IdentityService

  • 管理用户
  • 管理用户组
  • 用户与用户组的关系(MemberShip)
	/** 创建一个临时用户,且该用户必须被使用 */
    User newUser(String userId);

	/** 创建一个临时组,且该组必须被使用 */
  	Group newGroup(String groupId);

	/** 保存用户信息,如果用户已存在,则更新用户信息 */
    void saveUser(User user);

	/** 保存组信息,如果组已存在,则更新组信息 */
    void saveGroup(Group group);

	/** 删除用户信息,如果userId不存在,则忽略操作 */
  	void deleteUser(String userId);

	/** 删除组信息,如果groupId不存在,则忽略操作 */
    void deleteGroup(String groupId);

    void unlockUser(String userId);

	/** 建立用户和组的关系 */
  	void createMembership(String userId, String groupId);

	/** 删除用户和组的关系 */
    void deleteMembership(String userId, String groupId);

	/** 建立用户和租户的关系 */
	void createTenantUserMembership(String tenantId, String userId);

	/** 建立租户和组的关系 */
	void createTenantGroupMembership(String tenantId, String groupId);

    /** 
      * 设置当前线程中义已授权的用户id, 线程中的所有服务方法都需要验证这个 userId
      * 交互完成后需要调用clearAuthentication() 
      */
  	void setAuthenticatedUserId(String authenticatedUserId);
	/** 同上*/
  	void setAuthentication(String userId, List<String> groups);
	/** 同上*/
  	void setAuthentication(String userId, List<String> groups, List<String> tenantIds);

   /**
    * 获取当前流程引擎的身份认证
    */
	Authentication getCurrentAuthentication();

	/** 给用户设置图片 */
 	void setUserPicture(String userId, Picture picture);
 
	Picture getUserPicture(String userId);

  	void deleteUserPicture(String userId);

	/** 给用户添加一些扩展性的键值对 */
    void setUserInfo(String userId, String key, String value);

    String getUserInfo(String userId, String key);

    List<String> getUserInfoKeys(String userId);

    void deleteUserInfo(String userId, String key);

HistoryService

  • 管理流程实例结束后的历史数据

  • 构建历史数据的查询对象

  • 根据流程实例id删除流程历史数据

    历史数据实体:

    HistoricProcessInstance :历史流程实例实体类

    HistoricActivityInstance: 单个活动节点执行的信息

    HistoricVariableInstance: 流程或任务变量值的信息

    HistoricTaskInstance :用户任务实例的信息

    HistoricDetail: 历史流程活动任务详细信息

    /** 
      *	获取HistoricProcessInstanceQuery对象,用于查询历史流程信息 HistoricProcessInstance
      */
    HistoricProcessInstanceQuery createHistoricProcessInstanceQuery();
    
    /** 
      *	获取HistoricActivityInstanceQuery,用于查询单个流程定义执行的信息 HistoricActivityInstance
      */
    HistoricActivityInstanceQuery createHistoricActivityInstanceQuery();
    
    /** 
      *	获取HistoricActivityStatisticsQuery,单个流程定义的历史实例数的统计
      */
    HistoricActivityStatisticsQuery createHistoricActivityStatisticsQuery(String processDefinitionId);
    
    /** 
      *	获取HistoricTaskInstanceQuery,用于查询用户任务实例的信息 HistoricTaskInstance 
      */
    HistoricTaskInstanceQuery createHistoricTaskInstanceQuery();
    
    /** 获取HistoricDetailQuery,用于查询 历史流程活动任务详细信息HistoricDetail */
      HistoricDetailQuery createHistoricDetailQuery();
    
    /** 
      * 获取HistoricVariableInstanceQuery,
      *	用于查询 流程或任务变量值的信息 HistoricVariableInstance
      */
    HistoricVariableInstanceQuery createHistoricVariableInstanceQuery();
    
    /** 
      * HistoricIncidentQuery,
      *	用于查询事件信息 HistoricIncident
      */
    HistoricIncidentQuery createHistoricIncidentQuery();
    
    /** 
      * 根据taskId删除历史任务实例
      *	如果任务历史任务实例不存在,正常返回
      */
    void deleteHistoricTaskInstance(String taskId);
    
    /**
      * 删除历史进程实例。所有历史活动、历史任务和历史详细信息(变量更新、表单属性)也将被删除。
      */
    void deleteHistoricProcessInstance(String processInstanceId);
    
    /**
      * 删除历史进程实例。所有历史活动、历史任务和历史详细信息(变量更新、表单属性)也将被删除。
      * 如果未找到流程实例,则不会失败。
      */
    void deleteHistoricProcessInstanceIfExists(String processInstanceId);
    
    /**
      * job将删除已完成流程、决策和案例实例以及批量操作的历史数据
      */
    Job cleanUpHistoryAsync();
    
    /** 需要立即清除 */
    Job cleanUpHistoryAsync(boolean immediatelyDue);
    

FormService

  • 解析流程定义中表单项的配置

  • 提交表单的方式驱动用户节点流转

  • 获取自定义外部表单key

    /**
      * 得到开启一个流程实例的表单需要的所有数据
      */  
    StartFormData getStartFormData(String processDefinitionId);
    /**
      * 通过默认的内置表单引擎生成新流程实例的表单
      */
    Object getRenderedStartForm(String processDefinitionId);
    
    /**
      * 通过指定名称(formEngineName)的表单引擎生成新流程实例的表单
      */
    Object getRenderedStartForm(String processDefinitionId, String formEngineName);
    
    /**
      * 开启以一个新的流程实例,并带者一些用户在表单中填入的数据
      */
    ProcessInstance submitStartForm(String processDefinitionId,
                                    Map<String, Object> properties);