package com.neverwinterdp.scribengin.dataflow.worker;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.mycila.jmx.annotation.JmxBean;
import com.neverwinterdp.scribengin.dataflow.DataflowContainer;
import com.neverwinterdp.scribengin.dataflow.DataflowDescriptor;
import com.neverwinterdp.scribengin.dataflow.DataflowRegistry;
@Singleton
@JmxBean("role=dataflow-worker, type=DataflowTaskExecutorManager, name=DataflowTaskExecutorManager")
public class DataflowTaskExecutorManager {
private Logger logger = LoggerFactory.getLogger(DataflowTaskExecutorManager.class);
@Inject
private DataflowContainer container;
private DataflowDescriptor dataflowDescriptor;
private List<DataflowTaskExecutor> taskExecutors;
public DataflowContainer getDataflowContainer() { return container; }
public DataflowDescriptor getDataflowDescriptor() { return dataflowDescriptor; }
@Inject
public void onInit() throws Exception {
logger.info("Start onInit()");
DataflowRegistry dataflowRegistry = container.getDataflowRegistry();
dataflowDescriptor = dataflowRegistry.getDataflowDescriptor();
int numOfExecutors = dataflowDescriptor.getNumberOfExecutorsPerWorker();
taskExecutors = new ArrayList<DataflowTaskExecutor>();
for(int i = 0; i < numOfExecutors; i++) {
DataflowTaskExecutorDescriptor descriptor = new DataflowTaskExecutorDescriptor ("executor-" + i);
DataflowTaskExecutor executor = new DataflowTaskExecutor(descriptor, container);
executor.start();
taskExecutors.add(executor);
}
logger.info("Finish onInit()");
}
public void shutdown() throws Exception {
logger.info("Start shutdown()");
for(DataflowTaskExecutor sel : taskExecutors) {
if(sel.isAlive()) sel.shutdown();
}
logger.info("Finish shutdown()");
}
public boolean isAlive() {
for(DataflowTaskExecutor sel : taskExecutors) {
if(sel.isAlive()) return true;
}
return false;
}
synchronized public void waitForExecutorTermination(long checkPeriod) throws InterruptedException {
while(isAlive()) {
wait(checkPeriod);
}
}
public List<DataflowTaskExecutor> getExecutors() { return taskExecutors; }
}