package hudson.model.queue;
import hudson.ExtensionList;
import hudson.ExtensionPoint;
import hudson.model.Queue;
import hudson.model.Queue.BlockedItem;
import hudson.model.Queue.BuildableItem;
import hudson.model.Queue.Item;
import hudson.model.Queue.LeftItem;
import hudson.model.Queue.WaitingItem;
import java.util.concurrent.Executor;
/**
* Listener for events in {@link Queue}.
*
* <p>
* {@link Queue} is highly synchronized objects, and these callbacks are invoked synchronously.
* To avoid the risk of deadlocks and general slow down, please minimize the amount of work callbacks
* will perform, and push any sizable work to asynchronous execution via {@link Executor}, such as
* {@link Computer#threadPoolForRemoting}.
*
* <p>
* For the state transition of {@link hudson.model.Queue.Item} in {@link Queue}, please refer to the Queue javadoc.
*
* @author Kohsuke Kawaguchi
* @since 1.520
*/
public abstract class QueueListener implements ExtensionPoint {
/**
* When a task is submitted to the queue, it first gets to the waiting phase,
* where it spends until the quiet period runs out and the item becomes executable.
*
* @see WaitingItem#timestamp
*/
public void onEnterWaiting(WaitingItem wi) {}
/**
* An item leaves the waiting phase when the current time of the system is past its
* {@linkplain WaitingItem#timestamp due date}. The item will then enter either the blocked phase
* or the buildable phase.
*/
public void onLeaveWaiting(WaitingItem wi) {}
/**
* An item enters the blocked phase when there's someone saying "NO" to it proceeding to the buildable phase,
* such as {@link QueueTaskDispatcher}. Note that waiting for an executor to become available is not a part of this.
*/
public void onEnterBlocked(BlockedItem bi) {}
/**
* An item leaves the blocked phase and becomes buildable when there's no one vetoing.
*/
public void onLeaveBlocked(BlockedItem bi) {}
/**
* An item enters the buildable phase when all signals are green (or blue!) and it's just waiting
* for the scheduler to allocate it to the available executor. An item can spend considerable time
* in this phase for example if all the executors are busy.
*/
public void onEnterBuildable(BuildableItem bi) {}
/**
* An item leaves the buildable phase.
*
* It will move to the "left" state if the executors are allocated to it, or it will move to the
* blocked phase if someone starts vetoing once again.
*/
public void onLeaveBuildable(BuildableItem bi) {}
/**
* The item has left the queue, either by getting {@link Queue#cancel(Item) cancelled} or by getting
* picked up by an executor and starts running.
*/
public void onLeft(LeftItem li) {}
/**
* Returns all the registered {@link QueueListener}s.
*/
public static ExtensionList<QueueListener> all() {
return ExtensionList.lookup(QueueListener.class);
}
}