summaryrefslogtreecommitdiffstats
path: root/daemon/src/main/java/org/openslx/taskmanager/main/Taskmanager.java
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/src/main/java/org/openslx/taskmanager/main/Taskmanager.java')
-rw-r--r--daemon/src/main/java/org/openslx/taskmanager/main/Taskmanager.java46
1 files changed, 27 insertions, 19 deletions
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<Runnable>( 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<String, Class<? extends AbstractTask>> tasks = new ConcurrentHashMap<>();
+ private final Map<String, Class<? extends AbstractTask>> 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<String, AbstractTask> instances = new ConcurrentHashMap<>();
+ private final Map<String, AbstractTask> 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<? extends AbstractTask> 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 );
}
}