Class CurrentTaskFuture
- java.lang.Object
-
- org.glassfish.hk2.runlevel.internal.CurrentTaskFuture
-
- All Implemented Interfaces:
java.util.concurrent.Future<java.lang.Object>
,ChangeableRunLevelFuture
,RunLevelFuture
public class CurrentTaskFuture extends java.lang.Object implements ChangeableRunLevelFuture
This is the implementation of RunLevelFuture. There should only be one of these active in the system at any time. Of course users are given a handle to this object, so they can hold onto references to it for as long as they'd like.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static interface
CurrentTaskFuture.AllTheWay
private static class
CurrentTaskFuture.CancelTimer
private class
CurrentTaskFuture.DownAllTheWay
Goes down all the way to the proposed levelprivate static class
CurrentTaskFuture.DownQueueRunner
private static class
CurrentTaskFuture.HardCancelDownTimer
private static class
CurrentTaskFuture.QueueRunner
private class
CurrentTaskFuture.UpAllTheWay
private class
CurrentTaskFuture.UpOneLevel
-
Field Summary
Fields Modifier and Type Field Description private java.util.List<ServiceHandle<RunLevelListener>>
allListenerHandles
private java.util.List<ServiceHandle<ProgressStartedListener>>
allProgressStartedHandles
private java.util.List<ServiceHandle<Sorter>>
allSorterHandles
private AsyncRunLevelContext
asyncContext
private boolean
cancelled
private long
cancelTimeout
private boolean
done
private CurrentTaskFuture.DownAllTheWay
downAllTheWay
private java.util.concurrent.Executor
executor
private boolean
inCallback
private ServiceLocator
locator
private int
maxThreads
private int
proposedLevel
private java.util.Timer
timer
private CurrentTaskFuture.UpAllTheWay
upAllTheWay
private boolean
useThreads
-
Constructor Summary
Constructors Constructor Description CurrentTaskFuture(AsyncRunLevelContext asyncContext, java.util.concurrent.Executor executor, ServiceLocator locator, int proposedLevel, int maxThreads, boolean useThreads, long cancelTimeout, java.util.Timer timer)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
cancel(boolean mayInterruptIfRunning)
The cancel method attempts to cancel the current running job (if the job is not already completed or already cancelled).int
changeProposedLevel(int proposedLevel)
Changes the proposedLevel of this future.java.lang.Object
get()
java.lang.Object
get(long timeout, java.util.concurrent.TimeUnit unit)
int
getProposedLevel()
This gets the level that this future job is attempting to get to(package private) void
go()
private void
go(CurrentTaskFuture.UpAllTheWay localUpAllTheWay, CurrentTaskFuture.DownAllTheWay localDownAllTheWay)
private static void
invokeOnCancelled(CurrentTaskFuture job, int levelAchieved, java.util.List<ServiceHandle<RunLevelListener>> listeners)
private static ErrorInformation
invokeOnError(CurrentTaskFuture job, java.lang.Throwable th, ErrorInformation.ErrorAction action, java.util.List<ServiceHandle<RunLevelListener>> listeners, Descriptor descriptor)
private void
invokeOnProgress(ChangeableRunLevelFuture job, int level, java.util.List<ServiceHandle<RunLevelListener>> listeners)
private void
invokeOnProgressStarted(ChangeableRunLevelFuture job, int level, java.util.List<ServiceHandle<ProgressStartedListener>> listeners)
private static boolean
isACertainException(java.lang.Throwable th, java.lang.Class<? extends java.lang.Throwable> type)
boolean
isCancelled()
boolean
isDone()
boolean
isDown()
Returns true if this job represents the system going from a higher level to a lower level.boolean
isUp()
Returns true if this job represents the system going from a lower level to a higher level.private static boolean
isWasCancelled(java.lang.Throwable th)
(package private) static boolean
isWouldBlock(java.lang.Throwable th)
private void
setInCallback(boolean inCallback)
java.lang.String
toString()
-
-
-
Field Detail
-
asyncContext
private final AsyncRunLevelContext asyncContext
-
executor
private final java.util.concurrent.Executor executor
-
locator
private final ServiceLocator locator
-
proposedLevel
private int proposedLevel
-
useThreads
private final boolean useThreads
-
allListenerHandles
private final java.util.List<ServiceHandle<RunLevelListener>> allListenerHandles
-
allProgressStartedHandles
private final java.util.List<ServiceHandle<ProgressStartedListener>> allProgressStartedHandles
-
allSorterHandles
private final java.util.List<ServiceHandle<Sorter>> allSorterHandles
-
maxThreads
private final int maxThreads
-
timer
private final java.util.Timer timer
-
cancelTimeout
private final long cancelTimeout
-
upAllTheWay
private CurrentTaskFuture.UpAllTheWay upAllTheWay
-
downAllTheWay
private CurrentTaskFuture.DownAllTheWay downAllTheWay
-
done
private boolean done
-
cancelled
private boolean cancelled
-
inCallback
private boolean inCallback
-
-
Constructor Detail
-
CurrentTaskFuture
CurrentTaskFuture(AsyncRunLevelContext asyncContext, java.util.concurrent.Executor executor, ServiceLocator locator, int proposedLevel, int maxThreads, boolean useThreads, long cancelTimeout, java.util.Timer timer)
-
-
Method Detail
-
go
void go()
-
go
private void go(CurrentTaskFuture.UpAllTheWay localUpAllTheWay, CurrentTaskFuture.DownAllTheWay localDownAllTheWay)
-
isUp
public boolean isUp()
Description copied from interface:RunLevelFuture
Returns true if this job represents the system going from a lower level to a higher level. This method and isDown can both be false (for the case that proceedTo asked to go to the level it is already at) but they cannot both be true- Specified by:
isUp
in interfaceRunLevelFuture
- Returns:
- true if this job was proceeding from a lower level to a higher level
-
isDown
public boolean isDown()
Description copied from interface:RunLevelFuture
Returns true if this job represents the system going from a higher level to a lower level. This method and isUp can both be false (for the case that proceedTo asked to go to the level it is already at) but they cannot both be true- Specified by:
isDown
in interfaceRunLevelFuture
- Returns:
- true if this job was proceeding from a higher level to a lower level
-
cancel
public boolean cancel(boolean mayInterruptIfRunning)
Description copied from interface:RunLevelFuture
The cancel method attempts to cancel the current running job (if the job is not already completed or already cancelled). The meaning of cancel is different depending on whether or not the system was going up to a level or coming down to a level.If the system was going up to a level then calling cancel will cause the system to stop going up, and instead proceed back down to the last completed level. For example, suppose there were three services at level ten and the system was going up to level ten. As the system was proceeding up to level ten the first of the three services had already been started and the second service was in progress and the third service had not been started. The system will wait for the second service to complete coming up and then will shut it down along with the first service. Since the last completed level was nine, the system will remain at level nine and this job will be complete.
If the system was going down to a level then calling cancel will cause the system to continue going down, but it will stop going down at the next level. For example, suppose there were three services at level ten and the current proposed level is five. Suppose one of those three services had already been shutdown and one was in the process of being shutdown and the other had not yet been shutdown when the cancel arrives. The system will continue to shutdown the one in progress and then will shutdown the remaining service at level ten to reach level nine. However, the job will no longer attempt to go down to level five, but will instead be finished at level nine.
There is a cancel timeout value that is set. This is the amount of time the system will wait for services to complete after cancel has been called. Any services still running after this timeout will be orphaned (they will not be shutdown if they do eventually complete). Further, if an attempt is made to start the same service that is still running on another thread that request will fail.
- Specified by:
cancel
in interfacejava.util.concurrent.Future<java.lang.Object>
- Specified by:
cancel
in interfaceRunLevelFuture
- Parameters:
mayInterruptIfRunning
- is currently ignored
-
isCancelled
public boolean isCancelled()
- Specified by:
isCancelled
in interfacejava.util.concurrent.Future<java.lang.Object>
-
isDone
public boolean isDone()
- Specified by:
isDone
in interfacejava.util.concurrent.Future<java.lang.Object>
-
getProposedLevel
public int getProposedLevel()
Description copied from interface:RunLevelFuture
This gets the level that this future job is attempting to get to- Specified by:
getProposedLevel
in interfaceRunLevelFuture
- Returns:
- The level that this future job is attempting to go to
-
changeProposedLevel
public int changeProposedLevel(int proposedLevel)
Description copied from interface:ChangeableRunLevelFuture
Changes the proposedLevel of this future. A future cannot have its level changed if it is doneThis method may be called from the
RunLevelListener.onProgress(ChangeableRunLevelFuture, int)
callback- Specified by:
changeProposedLevel
in interfaceChangeableRunLevelFuture
- Parameters:
proposedLevel
- The new proposed level- Returns:
- The old proposed level
-
setInCallback
private void setInCallback(boolean inCallback)
-
get
public java.lang.Object get() throws java.lang.InterruptedException, java.util.concurrent.ExecutionException
- Specified by:
get
in interfacejava.util.concurrent.Future<java.lang.Object>
- Throws:
java.lang.InterruptedException
java.util.concurrent.ExecutionException
-
get
public java.lang.Object get(long timeout, java.util.concurrent.TimeUnit unit) throws java.lang.InterruptedException, java.util.concurrent.ExecutionException, java.util.concurrent.TimeoutException
- Specified by:
get
in interfacejava.util.concurrent.Future<java.lang.Object>
- Throws:
java.lang.InterruptedException
java.util.concurrent.ExecutionException
java.util.concurrent.TimeoutException
-
invokeOnProgress
private void invokeOnProgress(ChangeableRunLevelFuture job, int level, java.util.List<ServiceHandle<RunLevelListener>> listeners)
-
invokeOnProgressStarted
private void invokeOnProgressStarted(ChangeableRunLevelFuture job, int level, java.util.List<ServiceHandle<ProgressStartedListener>> listeners)
-
invokeOnCancelled
private static void invokeOnCancelled(CurrentTaskFuture job, int levelAchieved, java.util.List<ServiceHandle<RunLevelListener>> listeners)
-
invokeOnError
private static ErrorInformation invokeOnError(CurrentTaskFuture job, java.lang.Throwable th, ErrorInformation.ErrorAction action, java.util.List<ServiceHandle<RunLevelListener>> listeners, Descriptor descriptor)
-
isWouldBlock
static final boolean isWouldBlock(java.lang.Throwable th)
-
isWasCancelled
private static final boolean isWasCancelled(java.lang.Throwable th)
-
isACertainException
private static final boolean isACertainException(java.lang.Throwable th, java.lang.Class<? extends java.lang.Throwable> type)
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
-