Skip to content

Commit

Permalink
Stopping and removing workflow process instances on wf-related task d…
Browse files Browse the repository at this point in the history
…eletion.
  • Loading branch information
mederly committed Apr 13, 2016
1 parent 979091f commit c61983d
Show file tree
Hide file tree
Showing 8 changed files with 95 additions and 33 deletions.
Expand Up @@ -20,8 +20,6 @@ public interface WorkflowService {

void stopProcessInstance(String instanceId, String username, OperationResult parentResult);

void deleteProcessInstance(String instanceId, OperationResult parentResult);

void claimWorkItem(String workItemId, OperationResult parentResult) throws SecurityViolationException, ObjectNotFoundException;

void releaseWorkItem(String workItemId, OperationResult parentResult) throws ObjectNotFoundException, SecurityViolationException;
Expand Down
Expand Up @@ -1828,11 +1828,6 @@ public void stopProcessInstance(String instanceId, String username, OperationRes
getWorkflowManagerChecked().stopProcessInstance(instanceId, username, parentResult);
}

@Override
public void deleteProcessInstance(String instanceId, OperationResult parentResult) {
getWorkflowManagerChecked().deleteProcessInstance(instanceId, parentResult);
}

@Override
public void claimWorkItem(String workItemId, OperationResult parentResult) throws SecurityViolationException, ObjectNotFoundException {
getWorkflowManagerChecked().claimWorkItem(workItemId, parentResult);
Expand Down
Expand Up @@ -77,8 +77,6 @@ <T extends Containerable> SearchResultList<T> searchContainers(Class<T> type, Ob

void stopProcessInstance(String instanceId, String username, OperationResult parentResult);

void deleteProcessInstance(String instanceId, OperationResult parentResult);

/*
* MISC
* ====
Expand Down
Expand Up @@ -26,9 +26,13 @@
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.task.api.TaskDeletionListener;
import com.evolveum.midpoint.task.api.TaskManager;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.wf.api.ProcessListener;
import com.evolveum.midpoint.wf.api.WorkItemListener;
import com.evolveum.midpoint.wf.api.WorkflowManager;
Expand All @@ -45,16 +49,17 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Collection;
import java.util.List;

/**
* @author mederly
*/
@Component("workflowManager")
public class WorkflowManagerImpl implements WorkflowManager {
public class WorkflowManagerImpl implements WorkflowManager, TaskDeletionListener {

//private static final transient Trace LOGGER = TraceManager.getTrace(WorkflowManagerImpl.class);
private static final transient Trace LOGGER = TraceManager.getTrace(WorkflowManagerImpl.class);

@Autowired
private PrismContext prismContext;
Expand Down Expand Up @@ -83,8 +88,16 @@ public class WorkflowManagerImpl implements WorkflowManager {
@Autowired
private MiscDataUtil miscDataUtil;

@Autowired
private TaskManager taskManager;

private static final String DOT_INTERFACE = WorkflowManager.class.getName() + ".";

@PostConstruct
public void initialize() {
LOGGER.debug("Workflow manager starting.");
taskManager.registerTaskDeletionListener(this);
}

/*
* Work items
Expand Down Expand Up @@ -156,11 +169,6 @@ public void stopProcessInstance(String instanceId, String username, OperationRes
processInstanceManager.stopProcessInstance(instanceId, username, parentResult);
}

@Override
public void deleteProcessInstance(String instanceId, OperationResult parentResult) {
processInstanceManager.deleteProcessInstance(instanceId, parentResult);
}

@Override
public void synchronizeWorkflowRequests(OperationResult parentResult) {
processInstanceManager.synchronizeWorkflowRequests(parentResult);
Expand All @@ -183,6 +191,11 @@ public <T extends ObjectType> void augmentTaskObjectList(SearchResultList<PrismO
processInstanceProvider.augmentTaskObjectList(list, options, task, result);
}

@Override
public void onTaskDelete(Task task, OperationResult result) {
processInstanceManager.onTaskDelete(task, result);
}

/*
* Other
* =====
Expand Down
Expand Up @@ -19,6 +19,7 @@
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.task.api.TaskManager;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand Down Expand Up @@ -78,7 +79,7 @@ public void stopProcessInstance(String instanceId, String username, OperationRes
}
}

public void deleteProcessInstance(String instanceId, OperationResult parentResult) {
private void deleteProcessInstance(String instanceId, OperationResult parentResult) {
OperationResult result = parentResult.createSubresult(OPERATION_DELETE_PROCESS_INSTANCE);
result.addParam("instanceId", instanceId);

Expand All @@ -93,6 +94,26 @@ public void deleteProcessInstance(String instanceId, OperationResult parentResul
}
}

public void onTaskDelete(Task task, OperationResult result) {
try {
WfContextType wfc = task.getWorkflowContext();
if (wfc == null || wfc.getProcessInstanceId() == null) {
return;
}
String instanceId = wfc.getProcessInstanceId();
if (wfc.getEndTimestamp() == null) {
try {
stopProcessInstance(instanceId, "task delete action", result);
} catch (RuntimeException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't stop workflow process instance {} while processing task deletion event for task {}", e, instanceId, task);
}
}
deleteProcessInstance(instanceId, result);
} catch (RuntimeException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't process task deletion event for task {}", e, task);
}
}

class Statistics {
int processes = 0;
int processesWithNonExistingTaskOid = 0;
Expand Down
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2010-2016 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.evolveum.midpoint.task.api;

import com.evolveum.midpoint.schema.result.OperationResult;

/**
* @author mederly
*/
public interface TaskDeletionListener {

/**
* Called when a given task is to be deleted.
* Used e.g. to remove corresponding workflow process instance.
*
* @param task
* @param result
*/
void onTaskDelete(Task task, OperationResult result);
}
Expand Up @@ -675,6 +675,6 @@ public void modifyTask(String oid, Collection<? extends ItemDelta> modifications
*/
void registerHandler(String uri, TaskHandler handler);


void registerTaskDeletionListener(TaskDeletionListener listener);
//endregion
}
Expand Up @@ -35,19 +35,7 @@
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.security.api.SecurityEnforcer;
import com.evolveum.midpoint.task.api.LightweightIdentifier;
import com.evolveum.midpoint.task.api.LightweightIdentifierGenerator;
import com.evolveum.midpoint.task.api.LightweightTaskHandler;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.task.api.TaskExecutionStatus;
import com.evolveum.midpoint.task.api.TaskHandler;
import com.evolveum.midpoint.task.api.TaskListener;
import com.evolveum.midpoint.task.api.TaskManager;
import com.evolveum.midpoint.task.api.TaskManagerException;
import com.evolveum.midpoint.task.api.TaskManagerInitializationException;
import com.evolveum.midpoint.task.api.TaskPersistenceStatus;
import com.evolveum.midpoint.task.api.TaskRunResult;
import com.evolveum.midpoint.task.api.TaskWaitingReason;
import com.evolveum.midpoint.task.api.*;
import com.evolveum.midpoint.task.quartzimpl.cluster.ClusterManager;
import com.evolveum.midpoint.task.quartzimpl.cluster.ClusterStatusInformation;
import com.evolveum.midpoint.task.quartzimpl.execution.ExecutionManager;
Expand Down Expand Up @@ -142,14 +130,16 @@ public class TaskManagerQuartzImpl implements TaskManager, BeanFactoryAware {
// task handlers (mapped from their URIs)
private Map<String,TaskHandler> handlers = new HashMap<String, TaskHandler>();

private final Set<TaskDeletionListener> taskDeletionListeners = new HashSet<>();

// cached task prism definition
private PrismObjectDefinition<TaskType> taskPrismDefinition;

// error status for this node (local Quartz scheduler is not allowed to be started if this status is not "OK")
private NodeErrorStatusType nodeErrorStatus = NodeErrorStatusType.OK;

// task listeners
private Set<TaskListener> taskListeners = new HashSet<TaskListener>();
private Set<TaskListener> taskListeners = new HashSet<>();

/**
* Registered transient tasks. Here we put all transient tasks that are to be managed by the task manager.
Expand Down Expand Up @@ -776,9 +766,12 @@ public void deleteTask(String oid, OperationResult parentResult) throws ObjectNo
if (task.getNode() != null) {
result.recordWarning("Deleting a task that seems to be currently executing on node " + task.getNode());
}
for (TaskDeletionListener listener : taskDeletionListeners) {
listener.onTaskDelete(task, result);
}
repositoryService.deleteObject(TaskType.class, oid, result);
executionManager.removeTaskFromQuartz(oid, result);
result.recordSuccessIfUnknown();
result.computeStatusIfUnknown();
} catch (ObjectNotFoundException e) {
result.recordFatalError("Cannot delete the task because it does not exist.", e);
throw e;
Expand Down Expand Up @@ -1216,6 +1209,16 @@ private TaskType addTransientTaskInformation(PrismObject<TaskType> taskInReposit
// }
//endregion

//region Deletion listeners

@Override
public void registerTaskDeletionListener(TaskDeletionListener listener) {
Validate.notNull(listener, "Task deletion listener is null");
taskDeletionListeners.add(listener);
}

//endregion

//region Managing handlers and task categories
/*
* ********************* MANAGING HANDLERS AND TASK CATEGORIES *********************
Expand Down

0 comments on commit c61983d

Please sign in to comment.