Mina-2.0.7源码学习 --- IoHandler超时阻塞问题

本文探讨了Mina框架在实际应用中遇到的性能瓶颈,特别是由于耗时操作导致的处理延迟问题,并提出了解决方案,包括使用线程池处理耗时任务及采用ReadFuture实现异步读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      实际应用中,发现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()立即返回不阻塞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值