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() |
|----------------------------------------------------------------------------|