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 - complete() has been called before the request in which
ServletRequest.startAsync() has finished. As soon as that
request finishes, the complete() will be processed.
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 - dispatch() has been called before the request in which
ServletRequest.startAsync() has finished. As soon as that
request finishes, the dispatch() will be processed.
DISPATCHING - The dispatch is being processed.
ERROR - Something went wrong.
|-----------------»--------------|
| \|/
| |----------«---------------ERROR---------------------------«-------------------------------|
| | complete() /|\ | \ |
| | | | \---------------| |
| | | | |dispatch() |
| | | |postProcess() \|/ |
| | error()| | | |
| | | | |--|timeout() | |
| | postProcess() | \|/ | \|/ | auto |
| | |---------------»DISPATCHED«---------- | --------------COMPLETING«-----| |
| | | /|\ | | | /|\ | |
| | | |---»-------| | | |--| | |
| | ^ | |startAsync() | timeout() | |
| | | | | | | |
| \|/ | | complete() \|/ postProcess() | | |
| MUST_COMPLETE-«- | ----«------STARTING--»--------- | ------------| ^ |
| /|\ /|\ | | | | complete() | |
| | | | | | | /-----------| |
| | | ^ |dispatch() | | / |
| | | | | | | / |
| | | | \|/ / \|/ / postProcess() |
| | | | MUST_DISPATCH / STARTED«---------«---------| |
| | | | | / / | | | |
| | | | |postProcess() / / | | ^ |
^ | ^ | | / / | |asyncOperation() | |
| | | | | / / | | | |
| | | | | |---------- / ----------/ | |--READ_WRITE_OP--»---| |
| | | | | | / dispatch() | | | | |
| | | | | | |-----/ auto| | | | error()|
| | | | auto \|/ \|/ \|/ | dispatch()| | |-»--------|
| | | |---«------DISPATCHING«--------«------------- | ------«----| |
| | | /|\ | |
| | | | dispatch() \|/ |
| | | |-----------------------TIMING_OUT |
| | | | | |
| | |-------«----------------------------------«------| | |
| | complete() | |
| | | |
|«- | ----«-------------------«-------------------------------«--| |
| error() |
| complete() |
|----------------------------------------------------------------------------|