package ee.telekom.workflow.executor.consumer;
import java.lang.invoke.MethodHandles;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ee.telekom.workflow.core.common.WorkflowEngineConfiguration;
import ee.telekom.workflow.core.workflowinstance.WorkflowInstanceService;
import ee.telekom.workflow.core.workunit.WorkUnit;
import ee.telekom.workflow.executor.WorkflowExecutor;
import ee.telekom.workflow.executor.queue.WorkQueue;
@Component
public class WorkConsumerServiceImpl implements WorkConsumerService{
private static final Logger log = LoggerFactory.getLogger( MethodHandles.lookup().lookupClass() );
@Autowired
private WorkflowInstanceService workflowInstanceService;
@Autowired
private WorkQueue queue;
@Autowired
private WorkflowExecutor executor;
@Autowired
private WorkflowEngineConfiguration config;
private AtomicLong consumedWorkUnits = new AtomicLong();
@Override
public void consumeWorkUnit(){
WorkUnit workUnit = null;
try{
workUnit = queue.poll( 3, TimeUnit.SECONDS );
}
catch( InterruptedException e ){
}
if( workUnit != null ){
try{
log.info( "Retrieved '{}' from queue.", workUnit );
MDC.put( "workunit", workUnit.toString() );
workflowInstanceService.updateNodeName( workUnit.getWoinRefNum(), config.getNodeName() );
execute( workUnit );
consumedWorkUnits.incrementAndGet();
}
finally{
MDC.remove( "workunit" );
}
}
}
@Override
public long getConsumedWorkUnits(){
return consumedWorkUnits.get();
}
private void execute( WorkUnit wu ){
switch( wu.getType() ) {
case START_WORKFLOW:
executor.startWorkflow( wu.getWoinRefNum() );
break;
case ABORT_WORKFLOW:
executor.abortWorkflow( wu.getWoinRefNum() );
break;
case EXECUTE_TASK:
executor.executeTask( wu.getWoinRefNum(), wu.getWoitRefNum() );
break;
case COMPLETE_WORK_ITEM:
executor.completeWorkItem( wu.getWoinRefNum(), wu.getWoitRefNum() );
break;
}
}
}