实际应用中,发现Mina的效率没有想象的那么高,甚至说低下,想想应该不至于框架的诟病,应该是代码逻辑的问题,卡在的某一个环节。
仔细思考用户代码,发觉问题可能出现在自定义的IoHandler上面,如用户重写了一个IoHandler方法如下:
public class MessageHandler implements IoHandler {
public void sessionCreated(IoSession iosession) throws Exception {
}
//******
public void sessionIdle(IoSession iosession, IdleStatus idlestatus) {
}
public void exceptionCaught(IoSession iosession, Throwable throwable) {
}
public void messageReceived(IoSession iosession, Object message) {
if (message != null) {
// 远程调用等耗时操作处理过程
}
}
}
在用户重写的messageReceived方法中,可能调用了某个远程服务进行处理,而这个过程会耗时比较多,导致Mina处理这个Session的进程一直等待这个过程完成,才会返回,从而过多的用户请求都在队列中没有及时的处理,因为IoProcessor都卡住在IoHandler上面,而实际上,IoProcessor可以不等待 IoHandler处理完成就可以返回,只需要将数据(Object message)传递过去就可以返回了。
解决的途径是在messageReceived()方法中开启线程来处理这个比较耗时的操作,方法直接返回,可以考虑再使用线程池,Mina架构中已经很多地方使用到Executor了。
其次除了远程调用会比较耗时从而导致Processor线程一直阻塞在那儿,还有可能是message内容比较大,导致读取过程比较耗时,不过Mina已经提供了ReadFuture的异步读写方式,从而可以让messageReceived()立即返回不阻塞。