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.
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 from a container thread. The
dispatch will be processed once processing control returns to
the container.
DISPATCHING - dispatch() has been called from a non-container thread. The
dispatch will be processed as soon as a container thread is
available.
ERROR - Something went wrong.
|----------------->--------------|
| \|/
| |----------<---------------ERROR
| | complete() /|\ | \
| | | | \---------------|
| | | | |dispatch()
| | | |postProcess() \|/
| | error()| | |
| | | | |--|timeout() |
| | postProcess() | \|/ | \|/ | auto
| | |--------------->DISPATCHED<---------- | --------------COMPLETING<-----|
| | | /|\ | | | /|\ |
| | | |--->-------| | | |--| |
| | ^ | |startAsync() | timeout() |
| | | | | | |
| \|/ | | complete() \|/ postProcess() | |
| MUST_COMPLETE-<- | ----<------STARTING-->--------- | ------------| ^
| /|\ | | | | complete() |
| | | | | | /-----------|
| | ^ |dispatch() | | /
| | | | | | /
| | | \|/ | \|/ /
| | |----<----MUST_DISPATCH----<------| STARTED
| | | auto \ /|
| | | \ / |
^ ^ ^ \ dispatch()/ |
| | | \ / |
| | | |-------- \ -------------/ |auto
| | | | \ |
| | | | \ |
| | | auto \|/ \ \|/
| | |---<------DISPATCHING \---------TIMING_OUT
| | dispatch() | |
| | | |
| |-------<----------------------------------<------| |
| complete() |
| |
|<--------<-------------------<-------------------------------<--|
error()