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 but the
request in which that call was made has not finished
processing.
STARTED - ServletRequest.startAsync() has been called and the
request in which that call was made has finished
processing.
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 the request
finishes.
COMPLETE_PENDING - ServletRequest.startAsync() has been called and before the
request in which that call was had finished processing,
complete() was called for a non-container thread. The
complete() will be processed as soon as the request
finishes. This is different to MUST_COMPLETE because of
differences required to avoid race conditions during error
handling.
COMPLETING - The call to complete() was made once the request was in
the STARTED state. May or may not be triggered by a
container thread - depends if start(Runnable) was used.
TIMING_OUT - The async request has timed out and is waiting for a call
to complete(). If that isn't made, the error state will
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 the request
finishes.
DISPATCH_PENDING - ServletRequest.startAsync() has been called and before the
request in which that call was had finished processing,
dispatch() was called for a non-container thread. The
dispatch() will be processed as soon as the request
finishes. This is different to MUST_DISPATCH because of
differences required to avoid race conditions during error
handling.
DISPATCHING - The dispatch is being processed.
MUST_ERROR - ServletRequest.startAsync() has been called followed by an
I/O error on a non-container thread. The main purpose of
this state is to prevent additional async actions
(complete(), dispatch() etc.) on the non-container thread.
The container will perform the necessary error handling,
including ensuring that the AsyncLister.onError() method
is called.
ERROR - Something went wrong.
|-----«-------------------------------«------------------------------|
| |
| error() |
|-----------------»---| | |--«--------MUST_ERROR---------------«------------------------| |
| \|/ \|/\|/ | |
| |----------«-----E R R O R--«-----------------------«-------------------------------| | |
| | complete() /|\/|\\ \-«--------------------------------«-------| | | |
| | | | \ | | | |
| | |-----»-------| | \-----------»----------| | | | |
| | | | |dispatch() | | ^ |
| | | | \|/ ^ | | |
| | | | |--|timeout() | | | | |
| | | post() | | \|/ | post() | | | |
| | | |---------- | --»DISPATCHED«---------- | --------------COMPLETING«-----| | | |
| | | | | /|\/|\ | | | /|\ /|\ | | | |
| | | | |---»- | ---| | |startAsync() | timeout()|--| | | | | |
| | ^ ^ | | | | | | | ^ | |
| | | | | |-- \ -----| | complete() | |post() | | | |
| | | | | | \ | /--»----- | ---COMPLETE_PENDING-»-| ^ | | |
| | | | | | \ | / | | | | |
| | | | | ^ \ | / | complete() | | | |
| \|/ | | | | \ \|/ / post() | /---»-----| | ^ |
| MUST_COMPLETE-«- | - | --«----STARTING--»--------- | ------------| / | | |
| /|\ /|\ | | complete() | \ | | / error() | | ^
| | | | | | \ | | //---»----------| | |
| | | ^ | dispatch()| \ | post() | // | |
| | | | | | \ | |-----| | // nct-io-error | |
| | | | | | \ | | | | ///---»---------------| |
| | | | | \|/ \ | | \|/\| ||| |
| | | | |--«--MUST_DISPATCH-----«-----| |--«--STARTED«---------«---------| |
| | | | dispatched() /|\ | \ / | | post() | |
| | | | | | \ / | | | |
| | | | | | \ / | | | |
| | | | | |post() | | | | ^ |
^ | ^ | | | \|/ | | |asyncOperation() | |
| | | ^ | | DISPATCH_PENDING | | | | |
| | | | | | |post() | | | | |
| | | | | | | |----------| | |»-READ_WRITE_OP--»---| |
| | | | | | | | dispatch() | | | | |
| | | | | | | | | | | | |
| | | |post() | | | | timeout()| | | | error()|
| | | |dispatched() | \|/\|/ \|/ | dispatch()| | |-»--------|
| | | |---«---------- | ---DISPATCHING«-----«------ | ------«----| |
| | | | | ^ | |
| | | | |----| | |
| | | | timeout() | |
| | | | | |
| | | | dispatch() \|/ |
| | | |-----------«-----------TIMING_OUT |
| | | | | |
| | |-------«----------------------------------«------| | |
| | complete() | |
| | | |
|«- | ----«-------------------«-------------------------------«--| |
| error() |
| complete() |
|----------------------------------------------------------------------------|