Top Description Inners Fields Constructors Methods
org.apache.coyote

pack-priv Class AsyncStateMachine

extends Object
Class Inheritance
Imports
java.security.AccessController, .PrivilegedAction, java.util.concurrent.atomic.AtomicLong, org.apache.juli.logging.Log, .LogFactory, org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState, org.apache.tomcat.util.res.StringManager, org.apache.tomcat.util.security.PrivilegedGetTccl, .PrivilegedSetTccl

Manages the state transitions for async requests.
The internal states that are used are:
DISPATCHED       - Standard request. Not in Async mode.
STARTING         - ServletRequest.startAsync() has been called from
                   Servlet.service() but service() has not exited.
STARTED          - ServletRequest.startAsync() has been called from
                   Servlet.service() and service() has exited.
READ_WRITE_OP    - Performing an asynchronous read or write.
MUST_COMPLETE    - ServletRequest.startAsync() followed by complete() have
                   been called during a single Servlet.service() method. The
                   complete() will be processed as soon as Servlet.service()
                   exits.
COMPLETE_PENDING - ServletRequest.startAsync() has been called from
                   Servlet.service() but, before service() exited, complete()
                   was called from another thread. The complete() will
                   be processed as soon as Servlet.service() exits.
COMPLETING       - The call to complete() was made once the request was in
                   the STARTED state.
TIMING_OUT       - The async request has timed out and is waiting for a call
                   to complete() or dispatch(). If that isn't made, the error
                   state will be entered.
MUST_DISPATCH    - ServletRequest.startAsync() followed by dispatch() have
                   been called during a single Servlet.service() method. The
                   dispatch() will be processed as soon as Servlet.service()
                   exits.
DISPATCH_PENDING - ServletRequest.startAsync() has been called from
                   Servlet.service() but, before service() exited, dispatch()
                   was called from another thread. The dispatch() will
                   be processed as soon as Servlet.service() exits.
DISPATCHING      - The dispatch is being processed.
MUST_ERROR       - ServletRequest.startAsync() has been called from
                   Servlet.service() but, before service() exited, an I/O
                   error occurred on another thread. The container will
                   perform the necessary error handling when
                   Servlet.service() exits.
ERROR            - Something went wrong.


The valid state transitions are:

                 post()                                        dispatched()
   |-------»------------------»---------|    |-------«-----------------------«-----|
   |                                    |    |                                     |
   |                                    |    |        post()                       |
   |               post()              \|/  \|/       dispatched()                 |
   |           |-----»----------------»DISPATCHED«-------------«-------------|     |
   |           |                          | /|\ |                            |     |
   |           |              startAsync()|  |--|timeout()                   |     |
   ^           |                          |                                  |     |
   |           |        complete()        |                  dispatch()      ^     |
   |           |   |--«---------------«-- | ---«--MUST_ERROR--»-----|        |     |
   |           |   |                      |         /|\             |        |     |
   |           ^   |                      |          |              |        |     |
   |           |   |                      |    /-----|error()       |        |     |
   |           |   |                      |   /                     |        ^     |
   |           |  \|/  ST-complete()     \|/ /   ST-dispatch()     \|/       |     |
   |    MUST_COMPLETE«--------«--------STARTING--------»---------»MUST_DISPATCH    |
   |                                    / | \                                      |
   |                                   /  |  \                                     |
   |                    OT-complete() /   |   \    OT-dispatch()                   |
   |   COMPLETE_PENDING«------«------/    |    \-------»---------»DISPATCH_PENDING |
   |        |      /|\                    |                       /|\ |            |
   |        |       |                     |                        |  |post()      |
   |        |       |OT-complete()        |           OT-dispatch()|  |            |
   |        |       |---------«-------«---|---«--\                 |  |            |
   |        |                             |       \                |  |            |
   |        |         /-------«-------«-- | --«---READ_WRITE--»----|  |            |
   |        |        / ST-complete()      |        /  /|\  \          |            |
   |        |       /                     | post()/   /     \         |            |
   |        |      /                      |      /   /       \        |            |
   |        |     /                       |     /   /         \       |            |
   |        |    /                        |    /   /           \      |            |
   |        |   /                         |   |   /             \     |            |
   |        |  /                          |   |  /  ST-dispatch()\    |            |
   |        |  |                          |   | |                 \   |            |
   |  post()|  |  timeout()         post()|   | |asyncOperation()  \  |  timeout() |
   |        |  |  |--|                    |   | |                  |  |    |--|    |
   |       \|/\|/\|/ |     complete()    \|/ \|/|   dispatch()    \|/\|/  \|/ |    |
   |--«-----COMPLETING«--------«----------STARTED--------»---------»DISPATCHING----|
           /|\  /|\                       | /|\ |                       /|\ /|\
            |    |                        |  |--|                        |   |
            |    |               timeout()|  post()                      |   |
            |    |                        |                              |   |
            |    |       complete()      \|/         dispatch()          |   |
            |    |------------«-------TIMING_OUT--------»----------------|   |
            |                                                                |
            |            complete()                     dispatch()           |
            |---------------«-----------ERROR--------------»-----------------|


Notes: * For clarity, the transitions to ERROR which are valid from every state apart from
         STARTING are not shown.
       * All transitions may happen on either the Servlet.service() thread (ST) or on any
         other thread (OT) unless explicitly marked.

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static enum

Field Summary

Modifier and TypeField and Description
private AsyncContextCallback
private final AtomicLong
private boolean
private volatile long
private static final Log
private final AbstractProcessor
private static final StringManager
private volatile AsyncStateMachine.AsyncState

Constructor Summary

AccessConstructor and Description
pack-priv

Method Summary

Modifier and TypeMethod and Description
pack-priv synchronized boolean
pack-priv synchronized boolean
pack-priv synchronized void
pack-priv synchronized boolean
pack-priv synchronized void
pack-priv synchronized AbstractEndpoint.Handler.SocketState
pack-priv synchronized void
asyncRun(Runnable runnable)

pack-priv synchronized void
pack-priv synchronized boolean
private void
pack-priv long
pack-priv long

Returns:

The time (as returned by System#currentTimeMillis()) that this connection last transitioned to async
getLastAsyncStart
()

Obtain the time that this connection last transitioned to async processing.

pack-priv boolean
pack-priv boolean
pack-priv boolean
pack-priv boolean
pack-priv boolean
pack-priv synchronized boolean
pack-priv boolean
pack-priv synchronized void
private synchronized void
Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

asyncCtxtback to summary
private AsyncContextCallback asyncCtxt
generationback to summary
private final AtomicLong generation
hasProcessedErrorback to summary
private boolean hasProcessedError
lastAsyncStartback to summary
private volatile long lastAsyncStart
logback to summary
private static final Log log
processorback to summary
private final AbstractProcessor processor
smback to summary
private static final StringManager sm
stateback to summary
private volatile AsyncStateMachine.AsyncState state

Constructor Detail

AsyncStateMachineback to summary
pack-priv AsyncStateMachine(AbstractProcessor processor)

Method Detail

asyncCompleteback to summary
pack-priv synchronized boolean asyncComplete()
asyncDispatchback to summary
pack-priv synchronized boolean asyncDispatch()
asyncDispatchedback to summary
pack-priv synchronized void asyncDispatched()
asyncErrorback to summary
pack-priv synchronized boolean asyncError()
asyncOperationback to summary
pack-priv synchronized void asyncOperation()
asyncPostProcessback to summary
pack-priv synchronized AbstractEndpoint.Handler.SocketState asyncPostProcess()
asyncRunback to summary
pack-priv synchronized void asyncRun(Runnable runnable)
asyncStartback to summary
pack-priv synchronized void asyncStart(AsyncContextCallback asyncCtxt)
asyncTimeoutback to summary
pack-priv synchronized boolean asyncTimeout()
clearNonBlockingListenersback to summary
private void clearNonBlockingListeners()
getCurrentGenerationback to summary
pack-priv long getCurrentGeneration()
getLastAsyncStartback to summary
pack-priv long getLastAsyncStart()

Obtain the time that this connection last transitioned to async processing.

Returns:long

The time (as returned by System#currentTimeMillis()) that this connection last transitioned to async

isAsyncback to summary
pack-priv boolean isAsync()
isAsyncDispatchingback to summary
pack-priv boolean isAsyncDispatching()
isAsyncErrorback to summary
pack-priv boolean isAsyncError()
isAsyncStartedback to summary
pack-priv boolean isAsyncStarted()
isAsyncTimingOutback to summary
pack-priv boolean isAsyncTimingOut()
isAvailableback to summary
pack-priv synchronized boolean isAvailable()
isCompletingback to summary
pack-priv boolean isCompleting()
recycleback to summary
pack-priv synchronized void recycle()
updateStateback to summary
private synchronized void updateState(AsyncStateMachine.AsyncState newState)
org.apache.coyote back to summary

private final Enum AsyncStateMachine.AsyncState

extends Enum<AsyncStateMachine.AsyncState>
Class Inheritance

Field Summary

Modifier and TypeField and Description
public static final AsyncStateMachine.AsyncState
public static final AsyncStateMachine.AsyncState
public static final AsyncStateMachine.AsyncState
public static final AsyncStateMachine.AsyncState
public static final AsyncStateMachine.AsyncState
public static final AsyncStateMachine.AsyncState
private final boolean
private final boolean
private final boolean
private final boolean
public static final AsyncStateMachine.AsyncState
public static final AsyncStateMachine.AsyncState
public static final AsyncStateMachine.AsyncState
public static final AsyncStateMachine.AsyncState
public static final AsyncStateMachine.AsyncState
public static final AsyncStateMachine.AsyncState
public static final AsyncStateMachine.AsyncState

Constructor Summary

AccessConstructor and Description
private
AsyncState(boolean isAsync, boolean isStarted, boolean isCompleting, boolean isDispatching)

Method Summary

Modifier and TypeMethod and Description
pack-priv boolean
pack-priv boolean
pack-priv boolean
pack-priv boolean
public static AsyncStateMachine.AsyncState
public static AsyncStateMachine.AsyncState[]
Inherited from java.lang.Enum:
clonecompareTodescribeConstableequalsfinalizegetDeclaringClasshashCodenameordinaltoStringvalueOf

Field Detail

COMPLETE_PENDINGback to summary
public static final AsyncStateMachine.AsyncState COMPLETE_PENDING
COMPLETINGback to summary
public static final AsyncStateMachine.AsyncState COMPLETING
DISPATCH_PENDINGback to summary
public static final AsyncStateMachine.AsyncState DISPATCH_PENDING
DISPATCHEDback to summary
public static final AsyncStateMachine.AsyncState DISPATCHED
DISPATCHINGback to summary
public static final AsyncStateMachine.AsyncState DISPATCHING
ERRORback to summary
public static final AsyncStateMachine.AsyncState ERROR
isAsyncback to summary
private final boolean isAsync
isCompletingback to summary
private final boolean isCompleting
isDispatchingback to summary
private final boolean isDispatching
isStartedback to summary
private final boolean isStarted
MUST_COMPLETEback to summary
public static final AsyncStateMachine.AsyncState MUST_COMPLETE
MUST_DISPATCHback to summary
public static final AsyncStateMachine.AsyncState MUST_DISPATCH
MUST_ERRORback to summary
public static final AsyncStateMachine.AsyncState MUST_ERROR
READ_WRITE_OPback to summary
public static final AsyncStateMachine.AsyncState READ_WRITE_OP
STARTEDback to summary
public static final AsyncStateMachine.AsyncState STARTED
STARTINGback to summary
public static final AsyncStateMachine.AsyncState STARTING
TIMING_OUTback to summary
public static final AsyncStateMachine.AsyncState TIMING_OUT

Constructor Detail

AsyncStateback to summary
private AsyncState(boolean isAsync, boolean isStarted, boolean isCompleting, boolean isDispatching)

Method Detail

isAsyncback to summary
pack-priv boolean isAsync()
isCompletingback to summary
pack-priv boolean isCompleting()
isDispatchingback to summary
pack-priv boolean isDispatching()
isStartedback to summary
pack-priv boolean isStarted()
valueOfback to summary
public static AsyncStateMachine.AsyncState valueOf(String name)
valuesback to summary
public static AsyncStateMachine.AsyncState[] values()