On 07.03.2006, at 15:59, Niklas Therning wrote:
peter royal wrote:
Yes, I didn't think about that possibility. But why not have
something like the following:
IoAcceptor acceptor = ...;
IoHandlerFactory factory = ...;
acceptor.accept(address, factory);
where IoHandlerFactory is an interface that has the
responsibility to create IoHandlers. This factory would be used
by the acceptor to create an IoHandler whenever a new session is
accepted.
This way, both the client-side and server-side IoHandler could
safely use state in instance variables. This seems more
consistent to me.
I guess it just depends on what is the more common case. In my
experience, I have no problems with everything flowing into a
single IoHandler on the server side. So I would want an
IoHandlerFactory that just returned the same instance each time.
Whichever way it is implemented, I think it would be a valuable
contribution to MINA.
-pete
If the handler is per session there's no need to pass in the
session in all methods, is it? IMO it would be nicer to have a new
interface:
interface SingleSessionIoHandler {
void sessionOpened();
void messageReceived(Object message);
void sessionClosed();
...
}
implementation of this interface would typically store the session
as an instance variable.
The factory interface would look like:
interface SingleSessionIoHandlerFactory {
SingleSessionIoHandler create(IoSession session);
}
To achieve this in MINA you could implement a special IoHandler
which delegates to a SingleSessionIoHandler which it gets from the
session:
public class SingleSessionIoHandlerDelegate implements IoHandler {
SingleSessionIoHandlerFactory factory;
SingleSessionIoHandlerDelegate(SingleSessionIoHandlerFactory
factory){
this.factory = factory;
}
void sessionCreated(IoSession session) {
SingleSessionIoHandler handler = factory.create(session);
session.setAttribute("handler", handler);
}
void sessionOpened(IoSession session) {
SingleSessionIoHandler handler = session.getAttribute("handler");
handler.sessionOpened();
}
void messageReceived(IoSession session, Object message) {
SingleSessionIoHandler handler = session.getAttribute("handler");
handler.messageReceived(message);
}
...
}
To create an acceptor you would simply do:
IoAcceptor acceptor = ...;
SingleSessionIoHandlerFactory factory = ...;
acceptor.accept(address, new SingleSessionIoHandlerDelegate(factory));
My point is that there's no need to modify the IoAcceptor interface
to support this kind of behaviour. I see no harm in including
something like this in MINA. Simon, if you have a patch please add
it to JIRA and we'll consider it.
OK. I'll try to find some time to implement what you've suggested.
Thanks!
Simon