流程定义和部署管理——删除流程定义

来源:互联网 发布:网上直销软件 编辑:程序博客网 时间:2024/04/30 15:44

删除流程定义的url类似于:

/workflow/process/delete?deploymentId=${process.deploymentId}


调用的方法也很简单

    /**     * 删除部署的流程,级联删除流程实例     *     * @param deploymentId 流程部署ID     */    @RequestMapping(value = "/process/delete")    public String delete(@RequestParam("deploymentId") String deploymentId) {        repositoryService.deleteDeployment(deploymentId, true);        return "redirect:/workflow/process-list";    }

注意第二个参数,是否递归删除


来看一下具体实现:

public void deleteDeployment(String deploymentId, boolean cascade) {    this.commandExecutor.execute(new DeleteDeploymentCmd(deploymentId, cascade));  }

public class DeleteDeploymentCmd  implements Command<Void>, Serializable{  private static final long serialVersionUID = 1L;  protected String deploymentId;  protected boolean cascade;  public DeleteDeploymentCmd(String deploymentId, boolean cascade)  {    this.deploymentId = deploymentId;    this.cascade = cascade;  }  public Void execute(CommandContext commandContext) {    if (this.deploymentId == null) {      throw new ActivitiIllegalArgumentException("deploymentId is null");    }    commandContext.getProcessEngineConfiguration().getDeploymentManager().removeDeployment(this.deploymentId, this.cascade);    return null;  }}

DeploymentManager中

public void removeDeployment(String deploymentId, boolean cascade) {    DeploymentEntityManager deploymentEntityManager = Context.getCommandContext().getDeploymentEntityManager();    DeploymentEntity deployment = deploymentEntityManager.findDeploymentById(deploymentId);    if (deployment == null) {      throw new ActivitiObjectNotFoundException("Could not find a deployment with id '" + deploymentId + "'.", DeploymentEntity.class);    }    List processDefinitions = new ProcessDefinitionQueryImpl(Context.getCommandContext()).deploymentId(deploymentId).list();    ActivitiEventDispatcher eventDispatcher = Context.getProcessEngineConfiguration().getEventDispatcher();    for (ProcessDefinition processDefinition : processDefinitions)    {      if (eventDispatcher.isEnabled()) {        eventDispatcher.dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_DELETED, processDefinition));      }    }    deploymentEntityManager.deleteDeployment(deploymentId, cascade);    if (eventDispatcher.isEnabled()) {      eventDispatcher.dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_DELETED, deployment));    }    for (ProcessDefinition processDefinition : processDefinitions)      this.processDefinitionCache.remove(processDefinition.getId());  }

DeploymentEntityManager中

public void deleteDeployment(String deploymentId, boolean cascade) {    List processDefinitions = getDbSqlSession().createProcessDefinitionQuery().deploymentId(deploymentId).list();    List models = getDbSqlSession().createModelQueryImpl().deploymentId(deploymentId).list();    for (Model model : models) {      ModelEntity modelEntity = (ModelEntity)model;      modelEntity.setDeploymentId(null);      getModelManager().updateModel(modelEntity);    }    if (cascade)    {      for (ProcessDefinition processDefinition : processDefinitions) {        String processDefinitionId = processDefinition.getId();        getProcessInstanceManager().deleteProcessInstancesByProcessDefinition(processDefinitionId, "deleted deployment", cascade);      }    }    for (ProcessDefinition processDefinition : processDefinitions) {      String processDefinitionId = processDefinition.getId();      getIdentityLinkManager().deleteIdentityLinksByProcDef(processDefinitionId);      getEventSubscriptionManager().deleteEventSubscriptionsForProcessDefinition(processDefinitionId);    }    getProcessDefinitionManager().deleteProcessDefinitionsByDeploymentId(deploymentId);    for (ProcessDefinition processDefinition : processDefinitions)    {      List timerStartJobs = Context.getCommandContext().getJobEntityManager().findJobsByConfiguration("timer-start-event", processDefinition.getKey());      if ((timerStartJobs != null) && (timerStartJobs.size() > 0))      {        long nrOfVersions = new ProcessDefinitionQueryImpl(Context.getCommandContext()).processDefinitionKey(processDefinition.getKey()).count();        long nrOfProcessDefinitionsWithSameKey = 0L;        for (ProcessDefinition p : processDefinitions) {          if ((!p.getId().equals(processDefinition.getId())) && (p.getKey().equals(processDefinition.getKey()))) {            nrOfProcessDefinitionsWithSameKey += 1L;          }        }        if (nrOfVersions - nrOfProcessDefinitionsWithSameKey <= 1L) {          for (Job job : timerStartJobs) {            if (Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {              Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.JOB_CANCELED, job, null, null, processDefinition.getId()));            }            ((JobEntity)job).delete();          }        }      }      List findEventSubscriptionsByConfiguration = Context.getCommandContext().getEventSubscriptionEntityManager().findEventSubscriptionsByConfiguration("message", processDefinition.getId(), processDefinition.getTenantId());      for (EventSubscriptionEntity eventSubscriptionEntity : findEventSubscriptionsByConfiguration) {        eventSubscriptionEntity.delete();      }    }    getResourceManager().deleteResourcesByDeploymentId(deploymentId);    getDbSqlSession().delete("deleteDeployment", deploymentId);  }

ExecutionEntityManager中

public void deleteProcessInstancesByProcessDefinition(String processDefinitionId, String deleteReason, boolean cascade)  {    List processInstanceIds = getDbSqlSession().selectList("selectProcessInstanceIdsByProcessDefinitionId", processDefinitionId);    for (String processInstanceId : processInstanceIds) {      deleteProcessInstance(processInstanceId, deleteReason, cascade);    }    if (cascade)      Context.getCommandContext().getHistoricProcessInstanceEntityManager().deleteHistoricProcessInstanceByProcessDefinitionId(processDefinitionId);  }  public void deleteProcessInstance(String processInstanceId, String deleteReason, boolean cascade) {    ExecutionEntity execution = findExecutionById(processInstanceId);    if (execution == null) {      throw new ActivitiObjectNotFoundException("No process instance found for id '" + processInstanceId + "'", ProcessInstance.class);    }    CommandContext commandContext = Context.getCommandContext();    commandContext.getTaskEntityManager().deleteTasksByProcessInstanceId(processInstanceId, deleteReason, cascade);    execution.deleteCascade(deleteReason);    if (cascade)      commandContext.getHistoricProcessInstanceEntityManager().deleteHistoricProcessInstanceById(processInstanceId);  }

如果递归删除,会删除流程定义,流程实例以及各种历史实例……

0 0
原创粉丝点击