|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor
public abstract class AbstractMultiworkerIOReactor
Generic implementation of IOReactor
that can run multiple
BaseIOReactor
instance in separate worker threads and distribute
newly created I/O session equally across those I/O reactors for a more
optimal resource utilization and a better I/O performance. Usually it is
recommended to have one worker I/O reactor per physical CPU core.
Important note about exception handling
Protocol specific exceptions as well as those I/O exceptions thrown in the course of interaction with the session's channel are to be expected are to be dealt with by specific protocol handlers. These exceptions may result in termination of an individual session but should not affect the I/O reactor and all other active sessions. There are situations, however, when the I/O reactor itself encounters an internal problem such as an I/O exception in the underlying NIO classes or an unhandled runtime exception. Those types of exceptions are usually fatal and will cause the I/O reactor to shut down automatically.
There is a possibility to override this behavior and prevent I/O reactors
from shutting down automatically in case of a runtime exception or an I/O
exception in internal classes. This can be accomplished by providing a custom
implementation of the IOReactorExceptionHandler
interface.
If an I/O reactor is unable to automatically recover from an I/O or a runtime
exception it will enter the shutdown mode. First off, it cancel all pending
new session requests. Then it will attempt to close all active I/O sessions
gracefully giving them some time to flush pending output data and terminate
cleanly. Lastly, it will forcibly shut down those I/O sessions that still
remain active after the grace period. This is a fairly complex process, where
many things can fail at the same time and many different exceptions can be
thrown in the course of the shutdown process. The I/O reactor will record all
exceptions thrown during the shutdown process, including the original one
that actually caused the shutdown in the first place, in an audit log. One
can obtain the audit log using getAuditLog()
, examine exceptions
thrown by the I/O reactor prior and in the course of the reactor shutdown
and decide whether it is safe to restart the I/O reactor.
The following parameters can be used to customize the behavior of this class:
CoreConnectionPNames.TCP_NODELAY
CoreConnectionPNames.SO_TIMEOUT
CoreConnectionPNames.SO_LINGER
NIOReactorPNames.SELECT_INTERVAL
NIOReactorPNames.GRACE_PERIOD
NIOReactorPNames.INTEREST_OPS_QUEUEING
Field Summary | |
---|---|
protected java.util.List<ExceptionEvent> |
auditLog
|
protected IOReactorExceptionHandler |
exceptionHandler
|
protected boolean |
interestOpsQueueing
|
protected HttpParams |
params
|
protected java.nio.channels.Selector |
selector
|
protected long |
selectTimeout
|
protected IOReactorStatus |
status
|
Constructor Summary | |
---|---|
AbstractMultiworkerIOReactor(int workerCount,
java.util.concurrent.ThreadFactory threadFactory,
HttpParams params)
Creates an instance of AbstractMultiworkerIOReactor. |
Method Summary | |
---|---|
protected void |
addChannel(ChannelEntry entry)
Assigns the given channel entry to one of the worker I/O reactors. |
protected void |
addExceptionEvent(java.lang.Throwable ex)
Adds the given Throwable object to the audit log. |
protected void |
addExceptionEvent(java.lang.Throwable ex,
java.util.Date timestamp)
Adds the given Throwable object with the given time stamp
to the audit log. |
protected void |
awaitShutdown(long timeout)
Blocks for the given period of time in milliseconds awaiting the completion of the reactor shutdown. |
protected abstract void |
cancelRequests()
Triggered to cancel pending session requests. |
protected void |
doShutdown()
Activates the shutdown sequence for this reactor. |
void |
execute(IOEventDispatch eventDispatch)
Activates the main I/O reactor as well as all worker I/O reactors. |
java.util.List<ExceptionEvent> |
getAuditLog()
Returns the audit log containing exceptions thrown by the I/O reactor prior and in the course of the reactor shutdown. |
IOReactorStatus |
getStatus()
Returns the current status of the reactor. |
protected void |
prepareSocket(java.net.Socket socket)
Prepares the given Socket by resetting some of its properties. |
protected abstract void |
processEvents(int count)
Triggered to process I/O events registered by the main Selector . |
protected java.nio.channels.SelectionKey |
registerChannel(java.nio.channels.SelectableChannel channel,
int ops)
Registers the given channel with the main Selector . |
void |
setExceptionHandler(IOReactorExceptionHandler exceptionHandler)
Sets exception handler for this I/O reactor. |
void |
shutdown()
Initiates shutdown of the reactor and blocks for a default period of time waiting for the reactor to terminate all active connections, to shut down itself and to release system resources it currently holds. |
void |
shutdown(long waitMs)
Initiates shutdown of the reactor and blocks approximately for the given period of time in milliseconds waiting for the reactor to terminate all active connections, to shut down itself and to release system resources it currently holds. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
protected volatile IOReactorStatus status
protected final HttpParams params
protected final java.nio.channels.Selector selector
protected final long selectTimeout
protected final boolean interestOpsQueueing
protected IOReactorExceptionHandler exceptionHandler
protected java.util.List<ExceptionEvent> auditLog
Constructor Detail |
---|
public AbstractMultiworkerIOReactor(int workerCount, java.util.concurrent.ThreadFactory threadFactory, HttpParams params) throws IOReactorException
workerCount
- number of worker I/O reactors.threadFactory
- the factory to create threads.
Can be null
.params
- HTTP parameters.
IOReactorException
- in case if a non-recoverable I/O error.Method Detail |
---|
public IOReactorStatus getStatus()
IOReactor
getStatus
in interface IOReactor
public java.util.List<ExceptionEvent> getAuditLog()
protected void addExceptionEvent(java.lang.Throwable ex, java.util.Date timestamp)
Throwable
object with the given time stamp
to the audit log.
ex
- the exception thrown by the I/O reactor.timestamp
- the time stamp of the exception. Can be
null
in which case the current date / time will be used.protected void addExceptionEvent(java.lang.Throwable ex)
Throwable
object to the audit log.
ex
- the exception thrown by the I/O reactor.public void setExceptionHandler(IOReactorExceptionHandler exceptionHandler)
exceptionHandler
- the exception handler.protected abstract void processEvents(int count) throws IOReactorException
Selector
.
Super-classes can implement this method to react to the event.
count
- event count.
IOReactorException
- in case if a non-recoverable I/O error.protected abstract void cancelRequests() throws IOReactorException
Super-classes can implement this method to react to the event.
IOReactorException
- in case if a non-recoverable I/O error.public void execute(IOEventDispatch eventDispatch) throws java.io.InterruptedIOException, IOReactorException
IOEventDispatch
interface.
This method will enter the infinite I/O select loop on
the Selector
instance associated with this I/O reactor and used
to manage creation of new I/O channels. Once a new I/O channel has been
created the processing of I/O events on that channel will be delegated
to one of the worker I/O reactors.
The method will remain blocked unto the I/O reactor is shut down or the execution thread is interrupted.
execute
in interface IOReactor
eventDispatch
- the I/O event dispatch.
java.io.InterruptedIOException
- if the dispatch thread is interrupted.
IOReactorException
- in case if a non-recoverable I/O error.processEvents(int)
,
cancelRequests()
protected void doShutdown() throws java.io.InterruptedIOException
java.io.InterruptedIOException
- if the shutdown sequence has been
interrupted.protected void addChannel(ChannelEntry entry)
entry
- the channel entry.protected java.nio.channels.SelectionKey registerChannel(java.nio.channels.SelectableChannel channel, int ops) throws java.nio.channels.ClosedChannelException
Selector
.
channel
- the channel.ops
- interest ops.
java.nio.channels.ClosedChannelException
- if the channel has been already closed.protected void prepareSocket(java.net.Socket socket) throws java.io.IOException
Socket
by resetting some of its properties.
socket
- the socket
java.io.IOException
- in case of an I/O error.protected void awaitShutdown(long timeout) throws java.lang.InterruptedException
timeout
is set to 0
this method blocks
indefinitely.
timeout
- the maximum wait time.
java.lang.InterruptedException
- if interrupted.public void shutdown() throws java.io.IOException
IOReactor
shutdown
in interface IOReactor
java.io.IOException
- in case of an I/O error.public void shutdown(long waitMs) throws java.io.IOException
IOReactor
shutdown
in interface IOReactor
waitMs
- wait time in milliseconds.
java.io.IOException
- in case of an I/O error.
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |