Netty channel 关闭之后收到大量处理包
2018-01-18 18:57
169 查看
现象
Netty Channel.close()触发channelInactive此时 channel state isOpen=false, isActive=false, isWritable=false,此时channel不会在接收来至客户端的请求。
但是此时继承于SimpleChannelInboundHandler 的handler的channelRead0还是在不断处理数据包
场景
这一现象是在客户端对服务器压测过程中出现的。具体的压测方案是客户端瞬时发送大量请求,我这边会对请求进行处理,并将处理的结果返回给客户端。客户端在接受到服务器下发的包后,回复一个确认。
服务器下发一个包后,客户端在3秒内如果没有回复确认的话,服务器会认为客户端已经掉线,将通道关闭。
由于客户端存在的一个miss,导致在压测过程中的某一时刻发现客户端没有及时回复确认,于是服务器调用Channel.close()关闭通道。于是出现了这个现象。
分析
一个channel内的所有消息(包括数据请求以及inactive),都会放在一个接收队列里,并且是按照FIFO处理。客户端发送来大量的请求,这些请求一部分还在队列中的时候出发了Channel.close()。这时候inactive时间被放入接手队列的队尾,导致channel关闭后channelRead0仍然被触发了很多次,在这多次channelRead0函数调用之后,最后执行了inactive()。所以这个看是奇怪的现象其实是正常的Channel.close()之后处理的一系列数据包是在channel close之前就已经放在channel的接收队列中的,因为channel close之后是不会在接收对端请求的。
相关文章推荐
- HBase启动之后HMaster自动关闭的问题处理
- 收到邮件后看不附件或者发送邮件之后对方看不到附件应如何处理?
- Android串口通讯,在线程里一直监听是否有消息发来,接收到消息到runOnUiThread处理跳转页面,页面跳转关闭之后,在发送消息尽然还会执行在打开页面?
- 技术转载(鼠标点击X窗口关闭IE的同时清空session,最基本的就是处理用户重复登陆需要用到,我想这个的关键在于如何捕捉到关闭IE这个动作,之后再根据自身的需要使用session.invalidate()或者session.removeAttribute( "xxx "))
- ORACLE应用调优:请避免SQL做大量循环逻辑处理
- Opencv3.0-python的那些事儿:(九)、Opencv关于如何读取大量视频帧进行处理的方法
- 摘要Myeclipse或Eclipse 老是出现JPA project Change Event Handler,导致需要执行的处理没有进行;关闭也关不完。
- winForm打开及关闭处理事件一览
- 关于模态对话框关闭之后继续执行服务器端代码的问题
- linux下 c中怎么让才能安全关闭线程 和 linux线程退出时执行的程序(线程清理处理程序)简单例子
- session关闭异常的处理
- 收到从svn上荡下来有冲突的项目的处理方法
- 点击返回键之后的处理onKeyDown
- 利用或运算 和 与运算 来处理大量选项的是或否问题
- centos6下jbd2进程占用大量IO处理
- 在应用程序中处理系统注销、重起、关闭!
- [Selenium]通过Selenium实现在当前浏览器窗口点击一个图标之后,弹出另外一个窗口,关闭这个窗口,再回到原来的窗口进行操作
- linux虚拟机clone之后,eth0处理问题
- 为了避免android内存泄露,需要在使用完sql数据库游标(cursor)之后,关闭它!
- Linux大量的TIME_WAIT处理