Maarten Bosteels wrote:
I think that will be a nice improvement: simpler and more thread-safe,
don't see any downsides.

Here is a proposal :

 /**
  * Associate a decoder and encoder instances to the newly created session.
  *
  * @param nextFilter The next filter to invoke when having processed
the current
  * method
  * @param session The newly created session
  * @throws Exception if we can't create instances of the decoder or encoder
  */
 @Override
 public void sessionCreated(NextFilter nextFilter, IoSession session)
throws Exception {
     // Creates the decoder and stores it into the newly created session
     ProtocolDecoder decoder = factory.getDecoder(session);
     session.setAttribute(DECODER, decoder);

     // Creates the encoder and stores it into the newly created session
     ProtocolEncoder encoder = factory.getEncoder(session);
     session.setAttribute(ENCODER, encoder);

     // Call the next filter
     nextFilter.sessionCreated(session);
 }

Don't know whether it's documented somewhere, but looking at
ExecutorFilter code, I think it's safe to say that sessionCreated will
always be called BEFORE messageReceived.   (That's another promise to
add to the list of framework guarantees, I guess.)
I'm not so sure...
So your proposal looks OK to me.
I had a problem with the ChatClient example, as the ProtocolFilter wasn't added into the chain immediately, so its sessionCreated() handler was not called...

Also I don't really know why we are storing a decoder/encoder per session, when usually all the sessions will use the very same encoder/decoder instances? If the codec is stateless, we just have to instanciate it once for the whole server, and resue it.

wdyt ?

--
--
cordialement, regards,
Emmanuel Lécharny
www.iktek.com
directory.apache.org


Reply via email to