package com.neverwinterdp.scribengin.dataflow;
import com.neverwinterdp.scribengin.Record;
import com.neverwinterdp.scribengin.dataflow.DataflowTaskDescriptor.Status;
import com.neverwinterdp.scribengin.scribe.ScribeAbstract;
import com.neverwinterdp.scribengin.storage.source.SourceStreamReader;
public class DataflowTask {
private DataflowContainer container;
private DataflowTaskDescriptor descriptor;
private ScribeAbstract processor;
private DataflowTaskContext context;
private boolean interrupt = false;
private boolean complete = false;
public DataflowTask(DataflowContainer container, DataflowTaskDescriptor descriptor) throws Exception {
this.container = container;
this.descriptor = descriptor;
Class<ScribeAbstract> scribeType = (Class<ScribeAbstract>) Class.forName(descriptor.getScribe());
processor = scribeType.newInstance();
}
public DataflowTaskDescriptor getDescriptor() { return descriptor ; }
public boolean isComplete() { return this.complete ; }
public void interrupt() { interrupt = true; }
public void init() throws Exception {
DataflowRegistry dRegistry = container.getDataflowRegistry();
DataflowTaskReport report = dRegistry.getTaskReport(descriptor);
context = new DataflowTaskContext(container, descriptor, report);
descriptor.setStatus(Status.PROCESSING);
dRegistry.dataflowTaskUpdate(descriptor);
dRegistry.dataflowTaskReport(descriptor, report);
}
public void run() throws Exception {
DataflowTaskReport report = context.getReport();
System.err.println("begin task " + descriptor.getId() + ": " + " last commit count = " + report.getCommitProcessCount() + ", hash code = " + hashCode()) ;
SourceStreamReader reader = context.getSourceStreamReader() ;
Record record = null ;
while(!interrupt && (record = reader.next()) != null) {
report.incrProcessCount();
processor.process(record, context);
}
if(!interrupt) {
complete = true;
System.err.println("end task " + descriptor.getId() + " complete: " +
" last commit count = " + report.getCommitProcessCount() + ", process count " + report.getProcessCount() + ", hash code = " + hashCode());
} else {
System.err.println("end task " + descriptor.getId() + " interrupted: " +
" last commit count = " + report.getCommitProcessCount() + ", process count " + report.getProcessCount() + ", hash code = " + hashCode());
}
}
public void suspend() throws Exception {
saveContext();
container.getDataflowRegistry().dataflowTaskSuspend(descriptor);
}
public void finish() throws Exception {
saveContext();
container.getDataflowRegistry().dataflowTaskFinish(descriptor);
}
void saveContext() throws Exception {
DataflowRegistry dRegistry = container.getDataflowRegistry();
context.commit();
context.close();
DataflowTaskReport report = context.getReport();
report.setFinishTime(System.currentTimeMillis());
dRegistry.dataflowTaskReport(descriptor, report);
}
}