in spring-taskqueue/src/main/java/org/apache/archiva/components/taskqueue/execution/ThreadedTaskQueueExecutor.java [87:174]
public void run( )
{
while ( command != SHUTDOWN )
{
final T task;
if ( currentTask.get( ) == null )
{
try
{
task = queue.poll( 100, TimeUnit.MILLISECONDS );
}
catch ( InterruptedException e )
{
logger.info( "Executor thread interrupted, command: {}", ( command == SHUTDOWN
? "Shutdown"
: command == CANCEL_TASK ? "Cancel task" : "Unknown" ) );
continue;
}
if ( task == null )
{
continue;
}
if ( currentTask.compareAndSet( null, task ) )
{
try
{
Future future = executorService.submit( new Runnable( )
{
@Override
public void run( )
{
try
{
executor.executeTask( task );
}
catch ( TaskExecutionException e )
{
logger.error( "Error executing task: {}", e.getMessage( ), e );
}
}
} );
try
{
waitForTask( task, future );
}
catch ( ExecutionException e )
{
logger.error( "Error while waiting for task: {}", e.getMessage( ), e );
}
}
finally
{
currentTask.set( null );
}
}
else
{
logger.error( "There was another task running! " );
try
{
queue.put( task );
}
catch ( TaskQueueException e )
{
logger.error( "Could not put task back to queue" );
}
}
}
}
currentTask.set( null );
logger.info( "Executor thread '{}' exited.", name );
done = true;
synchronized (this)
{
notifyAll( );
}
}