package com.venky.swf.plugins.background.core.workers;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.StringReader;
import java.util.Collection;
import com.venky.core.io.ByteArrayInputStream;
import com.venky.core.util.Bucket;
import com.venky.swf.db.Database;
import com.venky.swf.plugins.background.core.AsyncTaskManager;
import com.venky.swf.plugins.background.core.Task;
import com.venky.swf.plugins.background.core.Task.Priority;
import com.venky.swf.plugins.background.db.model.DelayedTask;
import com.venky.swf.routing.Config;
public class DelayedTaskManager extends AsyncTaskManager<DelayedTask>{
private final DelayedTaskPollingThread dtpt ;
public DelayedTaskManager(){
super();
incrementPollerCount();
dtpt = new DelayedTaskPollingThread(this);
dtpt.start();
}
private Bucket numPollingThreadsWorking = new Bucket();
public void wakeUp(){
waitUntillPollersFinish();
super.wakeUp();
}
public boolean needMoreTasks(boolean tasksFoundInLastRun){
decrementPollerCount();
if (!tasksFoundInLastRun){
waitIfQueueIsEmpty(2*60);
}
waitUntilQueueIsEmpty();
waitUntilWorkersFinish(); // Avoid Locking with Workers.
boolean keepAlive = keepAlive();
if (keepAlive) {
incrementPollerCount();
}
return keepAlive;
}
public void decrementPollerCount(){
synchronized (numPollingThreadsWorking) {
numPollingThreadsWorking.decrement();
numPollingThreadsWorking.notifyAll();
Config.instance().getLogger(getClass().getName()).info("Number of pollers working " + numPollingThreadsWorking.intValue());
}
}
public void incrementPollerCount(){
synchronized (numPollingThreadsWorking) {
numPollingThreadsWorking.increment();
numPollingThreadsWorking.notifyAll();
Config.instance().getLogger(getClass().getName()).info("Number of pollers working " + numPollingThreadsWorking.intValue());
}
}
public void waitUntillPollersFinish(){
synchronized (numPollingThreadsWorking) {
while (numPollingThreadsWorking.intValue() != 0){
try {
Config.instance().getLogger(getClass().getName()).info("Number of pollers working " + numPollingThreadsWorking.intValue());
numPollingThreadsWorking.wait();
}catch(InterruptedException ex){
}
}
}
}
public void shutdown(){
super.shutdown();
while (true) {
try {
dtpt.join();
break;
} catch (InterruptedException e) {
}
}
Config.instance().getLogger(getClass().getName()).info("Polling Thread has shutdown");
}
protected void pushAsyncTasks(Collection<Task> tasks, Priority priority) {
for (Task task : tasks) {
try {
DelayedTask de = Database.getTable(DelayedTask.class).newRecord();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(task);
de.setPriority(Priority.DEFAULT.getValue());
de.setData(new ByteArrayInputStream(os.toByteArray()));
de.setLastError(new StringReader("Debug Message: Class is " + task.getClass().getName() ));
de.save();
} catch (IOException ex) {
throw new RuntimeException(task.getClass().getName() ,ex);
}
}
}
}