Hi,

some random thoughts about server initialization. The way a server is initialized is by bind the addresses we want the server to listen on on an IoAcceptor. Note that this initialization is done in three steps : - a first step is to bind the address. A future is created, put in a queue (registerQueue), and the acceptor is started, which do a select() with not timeout, and the selector is woke up. This is it for the first step, for the moment, as we are waiting on the future to be done. - the second step quicks in when the selector is woke up. The registerHandles() method is called, it pull the futures from the registerQueue(), then for each of them, it opens a ServerSocketChannel and initializes it. A the end, the channel is registered on the selector with an OP_ACCEPT flag, and inform the future that it's done. The thread now coninue processing incoming connection handles, and unbind requests (unlikely to have any ...), and at the end, block on the select() waiting for bind(), unbind() or connect events. - The third steps consists on firing all the attached listeners, one of them is the statisctic listener.

And that's it. I tried to be dense here, but trust me, you need aspirin power 2 to get a clue about what all this does.

Now, some ideas about MINA 3/0:
- first, in the three described steps, you can be sure that the third oe is not done properly, as the listeners may perfectly well be executed *after* the server has started received some new connection requests, and eventually executed some processing on them, f*cking up the stats. This is bloody wrong, but, meh, this is just about stats, so who cares ??? - second, I'm not sure we want to bind a new address once the server is started. There may be some use cases, but in any case, I would not let the Acceptor thread dealing with bind operation - third, and this is the major point, why do we have to use a future, a queue, some complex synchronization between two threads when all this can be done in one single thread : we can perfectly create and configure the new ServerSocketChannel *before* registering it on the selector, up to the point all the listeners and data structures have been processed. Then, and only then, we attach the channel to the selector.

Really I think MINA 2.0 is way to complex. Simple things should remain simple...

The unbind operation should also be handled in a simple way : it's just a matter of unregistering the channel from the selector, then to handle the cleanup...

Did I missed something ?

--
Regards,
Cordialement,
Emmanuel Lécharny
www.nextury.com


Reply via email to