package com.venky.swf.plugins.background.core.workers;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import com.venky.swf.db.Database;
import com.venky.swf.db.model.reflection.ModelReflector;
import com.venky.swf.plugins.background.db.model.DelayedTask;
import com.venky.swf.routing.Config;
import com.venky.swf.sql.Conjunction;
import com.venky.swf.sql.Expression;
import com.venky.swf.sql.Operator;
import com.venky.swf.sql.Select;
public class DelayedTaskPollingThread extends Thread{
private final DelayedTaskManager manager ;
private final ModelReflector<DelayedTask> ref = ModelReflector.instance(DelayedTask.class);
public DelayedTaskPollingThread(DelayedTaskManager manager){
super("DelayedTaskPollingThread");
setDaemon(false);
this.manager = manager;
this.maxTasksToBuffer = Math.max(10, manager.getNumWorkers() * 2);
}
private Expression getWhereClause(DelayedTask lastRecord){
Expression where = new Expression(ref.getPool(),Conjunction.OR);
for (int i = 0 ; i < DelayedTask.DEFAULT_ORDER_BY_COLUMNS.length ; i++ ){
String gtF = DelayedTask.DEFAULT_ORDER_BY_COLUMNS[i];
Expression part = new Expression(ref.getPool(),Conjunction.AND);
for (int j = 0 ; j < i ; j ++){
String f = DelayedTask.DEFAULT_ORDER_BY_COLUMNS[j];
part.add(new Expression(ref.getPool(),f, Operator.EQ, lastRecord.getRawRecord().get(f)));
}
part.add(new Expression(ref.getPool(),gtF, Operator.GT, lastRecord.getRawRecord().get(gtF)));
where.add(part);
}
return where;
}
private int maxTasksToBuffer = 1 ;
public int getMaxTasksToBuffer(){
return maxTasksToBuffer;
}
@Override
public void run(){
DelayedTask lastRecord = null;
Database db = null ;
List<DelayedTask> jobs = new ArrayList<DelayedTask>();
while (manager.needMoreTasks(!jobs.isEmpty())){
try {
Config.instance().getLogger(getClass().getName()).finest("Checking for Tasks...");
Expression where = new Expression(ref.getPool(),Conjunction.AND);
where.add(new Expression(ref.getPool(),ref.getColumnDescriptor("NUM_ATTEMPTS").getName(), Operator.LT , 10 ));
if (lastRecord != null){
where.add(getWhereClause(lastRecord));
}
db = Database.getInstance();
db.setTransactionIsolationLevel(Connection.TRANSACTION_READ_UNCOMMITTED);
List<String> realColumns = ref.getRealColumns();
realColumns.remove("DATA");
realColumns.remove("LAST_ERROR"); //Remove Clob and Blob Columns.
Select select = new Select(realColumns.toArray(new String[]{})).from(DelayedTask.class).
where(where).
orderBy(DelayedTask.DEFAULT_ORDER_BY_COLUMNS);
jobs = select.execute(DelayedTask.class,getMaxTasksToBuffer());
Config.instance().getLogger(getClass().getName()).finest("Number of tasks found:" + jobs.size());
if (jobs.isEmpty()){
lastRecord = null;
}else {
lastRecord = jobs.get(jobs.size()-1);
}
db.getCurrentTransaction().commit(); // Release all read locks before workers start.!!
manager.addAll(jobs);
}catch (Exception e){
if (db != null){
Config.instance().getLogger(getClass().getName()).info("Polling thread Rolling back due to exception 1 " + e.toString());
try {
db.getCurrentTransaction().rollback(e);
}catch (Exception ex){
ex.printStackTrace();
}
}
}finally{
if (db != null){
db.close();
db = null;
}
}
}
}
}