public class DemuxingIoHandler extends IoHandlerAdapter
IoHandler that demuxes messageReceived events
to the appropriate MessageHandler.
You can freely register and deregister MessageHandlers using
addReceivedMessageHandler(Class, MessageHandler) and
removeReceivedMessageHandler(Class).
When message is received through a call to
messageReceived(IoSession, Object) the class of the
message object will be used to find a MessageHandler for
that particular message type. If no MessageHandler instance can be
found for the immediate class (i.e. message.getClass()) the
interfaces implemented by the immediate class will be searched in depth-first
order. If no match can be found for any of the interfaces the search will be
repeated recursively for the superclass of the immediate class
(i.e. message.getClass().getSuperclass()).
Consider the following type hierarchy (Cx are classes while
Ix are interfaces):
C3 - I7 - I9
| | /\
| I8 I3 I4
|
C2 - I5 - I6
|
C1 - I1 - I2 - I4
| |
| I3
Object
When message is of type C3 this hierarchy will be
searched in the following order:
C3, I7, I8, I9, I3, I4, C2, I5, I6, C1, I1, I2, I3, I4, Object.
For efficiency searches will be cached. Calls to
addReceivedMessageHandler(Class, MessageHandler) and
removeReceivedMessageHandler(Class) clear this cache.
| Constructor and Description |
|---|
DemuxingIoHandler()
Creates a new instance with no registered
MessageHandlers. |
| Modifier and Type | Method and Description |
|---|---|
<E extends Throwable> |
addExceptionHandler(Class<E> type,
ExceptionHandler<? super E> handler)
Registers a
MessageHandler that receives the messages of
the specified type. |
<E> MessageHandler<? super E> |
addReceivedMessageHandler(Class<E> type,
MessageHandler<? super E> handler)
Registers a
MessageHandler that handles the received messages of
the specified type. |
<E> MessageHandler<? super E> |
addSentMessageHandler(Class<E> type,
MessageHandler<? super E> handler)
Registers a
MessageHandler that handles the sent messages of the
specified type. |
void |
exceptionCaught(IoSession session,
Throwable cause)
Invoked when any exception is thrown by user IoHandler implementation
or by MINA.
|
protected ExceptionHandler<Throwable> |
findExceptionHandler(Class<? extends Throwable> type) |
protected MessageHandler<Object> |
findReceivedMessageHandler(Class<?> type) |
protected MessageHandler<Object> |
findSentMessageHandler(Class<?> type) |
Map<Class<?>,ExceptionHandler<?>> |
getExceptionHandlerMap()
Returns the
Map which contains all messageType-MessageHandler
pairs registered to this handler. |
<E> MessageHandler<? super E> |
getMessageHandler(Class<E> type)
Returns the
MessageHandler which is registered to process
the specified type. |
Map<Class<?>,MessageHandler<?>> |
getReceivedMessageHandlerMap()
Returns the
Map which contains all messageType-MessageHandler
pairs registered to this handler for received messages. |
Map<Class<?>,MessageHandler<?>> |
getSentMessageHandlerMap()
Returns the
Map which contains all messageType-MessageHandler
pairs registered to this handler for sent messages. |
void |
messageReceived(IoSession session,
Object message)
Forwards the received events into the appropriate
MessageHandler
which is registered by addReceivedMessageHandler(Class, MessageHandler). |
void |
messageSent(IoSession session,
Object message)
Invoked when a message written by IoSession.write(Object) is sent out.
|
<E extends Throwable> |
removeExceptionHandler(Class<E> type)
Deregisters a
MessageHandler that receives the messages of
the specified type. |
<E> MessageHandler<? super E> |
removeReceivedMessageHandler(Class<E> type)
Deregisters a
MessageHandler that handles the received messages
of the specified type. |
<E> MessageHandler<? super E> |
removeSentMessageHandler(Class<E> type)
Deregisters a
MessageHandler that handles the sent messages of
the specified type. |
sessionClosed, sessionCreated, sessionIdle, sessionOpenedpublic DemuxingIoHandler()
MessageHandlers.public <E> MessageHandler<? super E> addReceivedMessageHandler(Class<E> type, MessageHandler<? super E> handler)
MessageHandler that handles the received messages of
the specified type.public <E> MessageHandler<? super E> removeReceivedMessageHandler(Class<E> type)
MessageHandler that handles the received messages
of the specified type.public <E> MessageHandler<? super E> addSentMessageHandler(Class<E> type, MessageHandler<? super E> handler)
MessageHandler that handles the sent messages of the
specified type.public <E> MessageHandler<? super E> removeSentMessageHandler(Class<E> type)
MessageHandler that handles the sent messages of
the specified type.public <E extends Throwable> ExceptionHandler<? super E> addExceptionHandler(Class<E> type, ExceptionHandler<? super E> handler)
MessageHandler that receives the messages of
the specified type.public <E extends Throwable> ExceptionHandler<? super E> removeExceptionHandler(Class<E> type)
MessageHandler that receives the messages of
the specified type.public <E> MessageHandler<? super E> getMessageHandler(Class<E> type)
MessageHandler which is registered to process
the specified type.public Map<Class<?>,MessageHandler<?>> getReceivedMessageHandlerMap()
Map which contains all messageType-MessageHandler
pairs registered to this handler for received messages.public Map<Class<?>,MessageHandler<?>> getSentMessageHandlerMap()
Map which contains all messageType-MessageHandler
pairs registered to this handler for sent messages.public Map<Class<?>,ExceptionHandler<?>> getExceptionHandlerMap()
Map which contains all messageType-MessageHandler
pairs registered to this handler.public void messageReceived(IoSession session, Object message) throws Exception
MessageHandler
which is registered by addReceivedMessageHandler(Class, MessageHandler).
Warning ! If you are to overload this method, be aware that you
_must_ call the messageHandler in your own method, otherwise it won't
be called.messageReceived in interface IoHandlermessageReceived in class IoHandlerAdapterExceptionpublic void messageSent(IoSession session, Object message) throws Exception
messageSent in interface IoHandlermessageSent in class IoHandlerAdapterExceptionpublic void exceptionCaught(IoSession session, Throwable cause) throws Exception
exceptionCaught in interface IoHandlerexceptionCaught in class IoHandlerAdapterExceptionprotected MessageHandler<Object> findReceivedMessageHandler(Class<?> type)
protected MessageHandler<Object> findSentMessageHandler(Class<?> type)
protected ExceptionHandler<Throwable> findExceptionHandler(Class<? extends Throwable> type)