From fd3c703e5a31b4194ce32a8ef651bc13a3d03cf1 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 27 Jan 2015 15:48:22 +0100 Subject: Make taskmanager an instance, add callback for finished jobs, improve parent dependency handling --- .../org/openslx/taskmanager/main/Taskmanager.java | 46 +++++++++++++--------- 1 file changed, 27 insertions(+), 19 deletions(-) (limited to 'daemon/src/main/java/org/openslx/taskmanager/main') diff --git a/daemon/src/main/java/org/openslx/taskmanager/main/Taskmanager.java b/daemon/src/main/java/org/openslx/taskmanager/main/Taskmanager.java index f3707ed..f9b7752 100644 --- a/daemon/src/main/java/org/openslx/taskmanager/main/Taskmanager.java +++ b/daemon/src/main/java/org/openslx/taskmanager/main/Taskmanager.java @@ -2,10 +2,10 @@ package org.openslx.taskmanager.main; import java.util.Iterator; import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; @@ -14,6 +14,7 @@ import java.util.concurrent.locks.ReentrantLock; import org.apache.log4j.Logger; import org.openslx.taskmanager.Global; import org.openslx.taskmanager.api.AbstractTask; +import org.openslx.taskmanager.api.FinishCallback; import org.openslx.taskmanager.api.TaskStatus; import org.openslx.taskmanager.util.ClassLoaderHack; import org.openslx.taskmanager.util.Util; @@ -21,32 +22,32 @@ import org.openslx.taskmanager.util.Util; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; -public class Taskmanager +public class Taskmanager implements FinishCallback, Runnable { private static final Logger log = Logger.getLogger( Taskmanager.class ); - private static final ExecutorService threadPool = Executors.newCachedThreadPool(); + private final ThreadPoolExecutor threadPool = new ThreadPoolExecutor( 4, 16, 1, TimeUnit.MINUTES, new ArrayBlockingQueue( 16 ) ); /** - * Static gson object for (de)serialization + * gson object for (de)serialization */ - private static final Gson gson = Util.explicitGsonInstance(); + private final Gson gson = Util.explicitGsonInstance(); /** * Cache of known tasks */ - private static final Map> tasks = new ConcurrentHashMap<>(); + private final Map> tasks = new ConcurrentHashMap<>(); /** * All the running/finished task instances. The mainloop will call wait() on this and this object * is notified as soon as the mainloop should check if there is any task available that can be * run. */ - private static final Map instances = new ConcurrentHashMap<>(); + private final Map instances = new ConcurrentHashMap<>(); - private static final Lock workLock = new ReentrantLock(); - private static final Condition doCheckForWork = workLock.newCondition(); + private final Lock workLock = new ReentrantLock(); + private final Condition doCheckForWork = workLock.newCondition(); /* * Static methods @@ -61,7 +62,7 @@ public class Taskmanager * @param taskId - ID of the task to retrieve the status of * @return TaskStatus */ - public static TaskStatus getTaskStatus( final String taskId ) + public TaskStatus getTaskStatus( final String taskId ) { AbstractTask task = instances.get( taskId ); if ( task == null ) @@ -81,7 +82,7 @@ public class Taskmanager * @return the TaskStatus returned by the newly created task, or a NO_SUCH_TASK TaskStatus if * there is no task registered under the given name. */ - public static TaskStatus submitTask( final String task, final String jsonData ) + public TaskStatus submitTask( final String task, final String jsonData ) { // Get task class Class taskClass; @@ -108,7 +109,7 @@ public class Taskmanager log.warn( task + " exists, but could not be instanciated!" ); return TaskStatus.ts_noSuchConstructor; } - if ( taskInstance.getId() == null ) { + if ( taskInstance.getId() == null || taskInstance.getId().isEmpty() ) { log.warn( "Tried to launch " + task + " with null-id" ); return TaskStatus.ts_noSuchConstructor; } @@ -123,13 +124,12 @@ public class Taskmanager AbstractTask parent = null; if ( taskInstance.getParentTaskId() != null ) parent = instances.get( taskInstance.getParentTaskId() ); - if ( taskInstance.init( parent ) ) { - checkForWork(); - } + taskInstance.init( parent, this ); + checkForWork(); return taskInstance.getStatus(); } - public static void releaseTask( String taskId ) + public void releaseTask( String taskId ) { final AbstractTask task = instances.get( taskId ); if ( task != null ) @@ -140,7 +140,7 @@ public class Taskmanager * Wakes up the Taskmanager's mainloop so it will check if any of the current task instances * is waiting for execution. */ - protected static void checkForWork() + protected void checkForWork() { workLock.lock(); try { @@ -150,7 +150,14 @@ public class Taskmanager } } - public static void run() + @Override + public void taskFinished() + { + checkForWork(); + } + + @Override + public void run() { try { while ( !Global.doShutdown ) { @@ -194,6 +201,7 @@ public class Taskmanager } catch ( InterruptedException e ) { log.info( "Interrupted!" ); } + System.exit( 0 ); } } -- cgit v1.2.3-55-g7522