Mina的ProtocolEncoderOutput之坑

  这个问题是之前测试上万个连接的pingpong发现的,调了很久,但当时急着做其他事,就没有详细记录下来,现在回想起来也有点记不清具体哪儿了。

  表现是在测试上万个连接的pingpong时会出现服务器挂起的现象,服务端无法收到任何消息,由于服务器用了OrderedThreadPoolExecutor,debug时发现OrderedThreadPoolExecutor的idleWorkers显示有15个空闲线程,但workers里一个Worker线程都没有,所以NioProcessor提交的任务都无法继续,服务器整个被挂起……

  后排排查发现mina的encoder最后手动调用了out.flush();,加了这行会在收发负载量大时因为mina的OrderedThreadPoolExecutor多线程模型导致内部抛异常、状态异常。。。

  在此记下这个坑

Mina的ProtocolEncoderOutput之坑

时间: 2025-01-03 00:01:16

Mina的ProtocolEncoderOutput之坑的相关文章

dubbo中的那些“坑”(1) - 关于MINA传输协议的bug定位及修复

同事刘阳使用dubbo服务器中配置mina作为网络传输层,发现大并发情况下,解码发生如下异常 014-12-01 18:00:44,652 [DubboServerHandler-10.1.19.13:20880-thread-164] WARN  alibaba.dubbo.remoting.exchange.codec.ExchangeCodec (ExchangeCodec.java:596) -  [DUBBO] Fail to encode response: Response [id

Mina airQQ聊天 服务端篇(二)

Mina聊天服务端实现思路:在用户登录的时候.连接服务端而且验证登录用户,假设成功,则将IoSession保存到map<账号,IoSession>中,而且通知该用户的好友上线,然 后再请求好友列表:若不成功,则断开连接. 自己定义协议格式:包头+包体 包头(10字节):包头长度(short)+ 消息类型(byte)+ 内容类型(byte) +  消息命令(short)+ 包体长度(int) 包体:JSON字符串 自己定义编码解码:因为数据在网络传输过程中都是以二进制传输的,所以我们能够自己定义

mina框架详解

Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务.虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能.高扩展性的网络通信应用,Mina 提供了事件驱动.异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型.Mina 主要有1.x 和2.x 两个分支,这里我们讲解最新版本2.0,如果你使用的是Mina 1.x,那么可能会有一些功能并

Mina框架项目运用

近期最一个项目对通信要求比較严格,须要建立长连接,且能处理多并发,所以选择了Mina框架.以下就简单记录开发的过程吧: mina 开发须要的jar包: mina pc端通信: 服务端: package cn.ys.net; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFactory; import org.apache.mina.filter.cod

项目积累——Mina

继续上一篇,这篇主要讲通过mina往B端发送消息,并接受消息,mina是一个网络通信框架,封装了javaNIO,简单易用,网上有很多关于他的介绍,在此不赘述了. 如上篇所介绍,完成功能,需要五个类: PoolListener:监听,用来在系统启动的时候创建连接: SessionPool:连接池: SendHandler:处理类: CharsetEncoder:编码: CharsetDecoder:解码: B为我们提供了6个端口,每个端口可建立3个长连接,因此,在系统时,就要创建长连接,下面是一个

Mina入门实例

继续上一篇,这篇主要讲通过mina往B端发送消息,并接受消息,mina是一个网络通信框架,封装了javaNIO,简单易用,网上有非常多关于他的介绍.在此不赘述了. 如上篇所介绍.完毕功能,须要五个类: PoolListener:监听.用来在系统启动的时候创建连接: SessionPool:连接池: SendHandler:处理类. CharsetEncoder:编码: CharsetDecoder:解码: B为我们提供了6个port,每一个port可建立3个长连接,因此.在系统时.就要创建长连接

Mina、Netty、Twisted一起学(五):整合protobuf

protobuf是谷歌的Protocol Buffers的简称,用于结构化数据和字节码之间互相转换(序列化.反序列化),一般应用于网络传输,可支持多种编程语言. protobuf怎样使用这里不再介绍,本文主要介绍在MINA.Netty.Twisted中怎样使用protobuf,不了解protobuf的同学能够去參考我的还有一篇博文. 在前面的一篇博文中.有介绍到一种用一个固定为4字节的前缀Header来指定Body的字节数的一种消息切割方式.在这里相同要使用到. 仅仅是当中Body的内容不再是字

基于mina框架的GPS设备与服务器之间的交互

偶然得了一个谷米的车载GPS设备(gt02d),做为程序员的我,开始躁动了:想着做一个服务器程序,记录GPS设备上传的坐标,然后在地图上绘制每天的轨迹...想想还是挺有意思的(其实前两年还有一个失败的经历,自己还弄了一个"TA在哪儿"的Android版本的程序,就是登录后,每1分钟通过Http上传坐标,这样你的好友就可以看到你在哪儿,还专门让老婆坐公交,我骑车测试,结果反应太慢了.后来,没有了,再后来,好些软件就有位置共享的功能了,哈哈...),只不过,轨迹大部分时间还是三点一线(宿舍

Apache Mina开发手册之四

Apache Mina开发手册之四 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.Mina开发的主要步骤 1.创建一个实现了IoService接口的类 IoService接口有两个子接口:1)IoAcceptor接口,用于服务器2)IoConnection接口,用于客户端 IoService接口的目的是提供服务,有几个默认实现:NioDatagramAcceptor.NioDatagramConnectorNioSocketAcceptor.N