删除流程定义的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);
}
如果递归删除,会删除流程定义,流程实例以及各种历史实例……