Skip to content
This repository has been archived by the owner on Mar 15, 2024. It is now read-only.

Commit

Permalink
JBPM-3661-HT Deadlines are not cancelled on task completion
Browse files Browse the repository at this point in the history
  • Loading branch information
mswiderski committed Jun 4, 2012
1 parent ababf75 commit 5181ddf
Show file tree
Hide file tree
Showing 4 changed files with 359 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ public class DefaultEscalatedDeadlineHandler

private ClassLoader classLoader;

protected List<Status> validStatuses = new ArrayList<Status>();

public DefaultEscalatedDeadlineHandler(Properties properties) {
handler = new EmailWorkItemHandler();

Expand All @@ -81,6 +83,7 @@ public DefaultEscalatedDeadlineHandler(Properties properties) {
replyTo = properties.getProperty( "replyTo", null );

handler.setConnection( host, port, user, password );
setValidStatuses();
}

public DefaultEscalatedDeadlineHandler(Properties properties, ClassLoader classLoader) {
Expand All @@ -96,6 +99,7 @@ public DefaultEscalatedDeadlineHandler(Properties properties, ClassLoader classL

handler.setConnection( host, port, user, password );
this.classLoader = classLoader;
setValidStatuses();
}

public DefaultEscalatedDeadlineHandler() {
Expand All @@ -111,7 +115,7 @@ public DefaultEscalatedDeadlineHandler() {
replyTo = conf.getProperty( "replyTo", null );

handler.setConnection( host, port, user, password );

setValidStatuses();
}

public UserInfo getUserInfo() {
Expand Down Expand Up @@ -168,10 +172,10 @@ public void executeEscalatedDeadline(Task task,
Deadline deadline,
Content content,
TaskService service) {
if ( deadline == null || deadline.getEscalations() == null ) {
if ( deadline == null || deadline.getEscalations() == null || !isInValidStatus(task) ) {
return;
}

for ( Escalation escalation : deadline.getEscalations() ) {

// we won't impl constraints for now
Expand Down Expand Up @@ -338,4 +342,21 @@ private void buildMapByLanguage(Map<String, List<User>> map,
list.add( user );
}

protected void setValidStatuses() {
validStatuses.add(Status.Created);
validStatuses.add(Status.Ready);
validStatuses.add(Status.Reserved);
validStatuses.add(Status.InProgress);
validStatuses.add(Status.Suspended);
}

protected boolean isInValidStatus(Task task) {

if (this.validStatuses.contains(task.getTaskData().getStatus())) {
return true;
}
return false;

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,14 @@
import java.io.Reader;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

Expand Down Expand Up @@ -68,6 +73,9 @@ public class TaskService {
private SystemEventListener systemEventListener;

private Map<Operation, List<OperationCommand>> operations;

private Map<Long, List<ScheduledFuture<ScheduledTaskDeadline>>> scheduledTaskDeadlines
= new ConcurrentHashMap<Long, List<ScheduledFuture<ScheduledTaskDeadline>>>();

/**
* Constructor in which no EscalatedDeadlineHandler is given.
Expand Down Expand Up @@ -170,9 +178,35 @@ public TasksAdmin createTaskAdmin() {

public void schedule(ScheduledTaskDeadline deadline,
long delay) {
scheduler.schedule(deadline,
ScheduledFuture<ScheduledTaskDeadline> scheduled = scheduler.schedule(deadline,
delay,
TimeUnit.MILLISECONDS);
List<ScheduledFuture<ScheduledTaskDeadline>> knownFeatures = scheduledTaskDeadlines.get(deadline.getTaskId());
if (knownFeatures == null) {
knownFeatures = new CopyOnWriteArrayList<ScheduledFuture<ScheduledTaskDeadline>>();
}
knownFeatures.add(scheduled);

this.scheduledTaskDeadlines.put(deadline.getTaskId(), knownFeatures);
}

public void unschedule(long taskId) {
List<ScheduledFuture<ScheduledTaskDeadline>> knownFeatures = scheduledTaskDeadlines.remove(taskId);
if (knownFeatures == null) {
return;
}
Iterator<ScheduledFuture<ScheduledTaskDeadline>> it = knownFeatures.iterator();
while (it.hasNext()) {
ScheduledFuture<ScheduledTaskDeadline> scheduled = it.next();
try {
if (!scheduled.isDone() && !scheduled.isCancelled()) {
scheduled.cancel(true);
}

} catch (Exception e) {
logger.error("Error while cancelling scheduled deadline task for Task with id " + taskId, e);
}
}
}

public Map<Operation, List<OperationCommand>> getOperations() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,10 @@ public void doOperation() {
postTaskSkipOperation(task, userId);
break;
}
case Exit: {
postTaskExitOperation(task, userId);
break;
}
}

}
Expand All @@ -500,6 +504,8 @@ private void taskCompleteOperation(final Task task, final ContentData data) {
}

private void postTaskCompleteOperation(final Task task) {
service.unschedule(task.getId());

// trigger event support
service.getEventSupport().fireTaskCompleted(task.getId(), task.getTaskData().getActualOwner().getId());
}
Expand All @@ -512,6 +518,8 @@ private void taskFailOperation(final Task task, final ContentData data) {
}

private void postTaskFailOperation(final Task task) {
service.unschedule(task.getId());

// trigger event support
service.getEventSupport().fireTaskFailed(task.getId(), task.getTaskData().getActualOwner().getId());
}
Expand All @@ -521,10 +529,16 @@ private void taskSkipOperation(final Task task, final String userId) {
}

private void postTaskSkipOperation(final Task task, final String userId) {
service.unschedule(task.getId());

// trigger event support
service.getEventSupport().fireTaskSkipped(task.getId(), userId);
}

private void postTaskExitOperation(final Task task, final String userId) {
service.unschedule(task.getId());
}

public Task getTask(final long taskId) {
return getEntity(Task.class, taskId);
}
Expand Down
Loading

0 comments on commit 5181ddf

Please sign in to comment.