package com.breakersoft.plow.dispatcher;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.breakersoft.plow.dispatcher.domain.DispatchJob;
import com.breakersoft.plow.dispatcher.domain.DispatchProc;
import com.breakersoft.plow.dispatcher.domain.DispatchProject;
import com.breakersoft.plow.dispatcher.domain.DispatchResult;
import com.breakersoft.plow.dispatcher.domain.DispatchTask;
import com.breakersoft.plow.monitor.PlowStats;
import com.breakersoft.plow.rndaemon.RndClientPool;
/**
*
* Logic for redispatching an existing proc. Existing procs can only
* go to the same job.
*
* @author chambers
*
*/
@Component
public class ProcDispatcher extends AbstractDispatcher implements Dispatcher<DispatchProc> {
@Autowired
private RndClientPool rndClientPool;
@Override
public DispatchResult dispatch(DispatchProc proc) {
final DispatchResult result = new DispatchResult(proc);
dispatch(result, proc);
if (result.procs == 0) {
dispatchService.markAsDeallocated(proc);
PlowStats.procDispatchMiss.incrementAndGet();
}
else {
PlowStats.procDispatchHit.incrementAndGet();
}
return result;
}
public void dispatch(final DispatchResult result, DispatchProc proc) {
final List<DispatchTask> tasks =
dispatchService.getDispatchableTasks(proc, proc, 25);
for (DispatchTask task: tasks) {
if (!result.continueDispatching()) {
break;
}
dispatch(result, proc, task);
}
}
@Override
public void dispatch(DispatchResult result, DispatchProc proc, DispatchTask task) {
if (!dispatchService.reserveTask(task)) {
return;
}
try {
dispatchService.assignProc(proc, task);
} catch (RuntimeException e) {
dispatchFailed(result, proc, task, "Unable to assign proc to a resereved task.");
PlowStats.procDispatchFail.incrementAndGet();
return;
}
if (dispatchService.startTask(task, proc)) {
result.addDispatchPair(proc, task);
if (!result.isTest) {
rndClientPool.executeProcess(proc, task);
}
PlowStats.taskStartedCount.incrementAndGet();
}
else {
dispatchFailed(result, proc, task, "Critical, was able to reserve task but not start it.");
PlowStats.procDispatchFail.incrementAndGet();
PlowStats.taskStartedFailCount.incrementAndGet();
}
}
@Override
public void dispatch(DispatchResult result, DispatchProc resource,
DispatchProject project) {
// TODO Auto-generated method stub
}
@Override
public void dispatch(DispatchResult result, DispatchProc resource,
DispatchJob job) {
// TODO Auto-generated method stub
}
}