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

删除流程定义的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);
  }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值