hakan eryargi a écrit :
hi,
how can i guarantee messages are processed in arrival order and
sequantially (one is processed after previous is completed) for
NioSocketAcceptor ?
This is guaranteed, as soon as you don't inject an ExecutorFilter in
your chain (see [1] for more info about this point). The way incoming
messages are processed by MINA is pretty simple : each opened socket is
associated with a selector, itself associated with a IoProcessor.
IoProcessor uses a single thread to process this message, but to insure
some scalability, we spawn more than one IoProcessor, and we also use a
queue (the backlog) for messages waiting to be processed when the thread
is busy. So the order will always be respected, as the next message can
only be processed when the current message has been completely processed.
The biggest issue with this approach is that each message is considered
having the very same priority, and a message neeeding a long processing
will block all the other messages. More important, you will block
messages from other sessions too. That's painful, and this is one of the
reason the ExecutorFilter has been added.
i guess, as tcp guarantees packet order, for each IoSession message
order is guaranteed. but if messages are passed to IoHandler in a
multi-threaded manner there could be cases process order is different
from arrival order.
[1] This is where the ExecutorFilter comes into the picture : it creates
a way to process more than one message at the time (or kind of...). The
drawback is that you may have more than one message of a specific
session being processed in parallel. This can be avoided by teling the
ExecutorFilter to use a OrderedThreadPoolExecutor.
Hope it helps.
--
Regards,
Cordialement,
Emmanuel Lécharny
www.nextury.com