mina 心跳机制的介绍

MINA自己提供了一个过滤器类: org.apache.mina.filter.keepalive . KeepAliveFilter ,该过滤器用于在IO空闲的时候发送而且反馈心跳包(keep-alive request/response)。 

说到KeepAliveFilter这个类有必要先说一说其构造函数,即实例化该类须要些什么,该类构造函数中参数有三个分别是: 
(1)KeepAvlieMessageFactory:   该实例引用用于判断接受与发送的包是不是心跳包,以及心跳请求包的实现 
(2)IdleStatus:                              该过滤器所关注的空闲状态,默认认为读取空闲。 即当读取通道空闲的时候发送心跳包 
(3)KeepAliveRequestTimeoutHandler: 心跳包请求后超时无反馈状况下的处理机制  默认为CLOSE  即关闭链接 

首先须要实现接口   KeepAliveMessageFactory    该接口中的抽象方法有:html

 实现 方法: public boolean isRequest(IoSession session, Object message):判断是否心跳请求包  是的话返回true 
                             public boolean isResponse(IoSession session, Object message):因为被动型心跳机制,没有请求固然也就不关注反馈 所以直接返回false
                             
 public Object getRequest(IoSession session): 被动型心跳机制无请求  所以直接返回null
                             
 public Object getResponse(IoSession session, Object request) : 根据心跳请求request 反回一个心跳反馈消息 
java

通常来讲心跳机制主要分为如下四类: 
1, active 活跃型:  当读取通道空闲的时候发送心跳请求,一旦该心跳请求被发送,那么须要在keepAliveRequestTimeout时间内接收到心跳反馈,不然KeepAliveRequestTimeoutHandler将会被调用,当一个心跳请求包被接受到后,那么心跳反馈也会当即发出。 
针对活跃型心跳机制:  KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession  session)与getResponse ( IoSession  session,  Object  request)必须返回非空。

2, semi-active 半活跃型:当读取通道空闲的时候发送心跳请求,然而并不在意心跳反馈有没有,当一个心跳请求包被接收到后,那么心跳反馈也会当即发出。 
针对半活跃型心跳机制:   KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession  session)与getResponse ( IoSession  session,  Object  request)必须返回非空。而且心跳包请求后超时无反馈的处理机制设置为KeepAliveRequestTimeoutHandler.NOOP(不作任何处理), KeepAliveRequestTimeoutHandler.LOG(只输出警告信息不作其余处理)

3, passive 被动型:当前IO不但愿主动发送心跳请求,可是当接受到一个心跳请求后,那么该心跳反馈也会当即发出。 
针对被动型心跳机制:  KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession  session)必须反馈null 与 getResponse ( IoSession  session,  Object  request)必须反馈non-null. 

4, deaf speaker 聋子型: 当前IO会主动发送心跳请求,可是不想发送任何心跳反馈。 
 针对聋子型心跳机制:  KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession  session)必须反馈non-null与 getResponse ( IoSession  session,  Object  request)必须反馈null,将KeepAliveRequestTimeoutHandler 设置为DEAF_SPEAKER. 

5, sient-listener 持续监听型:既不想发送心跳请求也不想发送心跳反馈。 
针对持续监听型心跳机制:  KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession  session)必须反馈null 与 getResponse ( IoSession  session,  Object  request)必须反馈null.


心跳包请求超时后的处理机制:接口
 KeepAliveRequestTimeoutHandler ,通常该处理主要是针对可以发送心跳请求的心跳机制。
1.CLOSE:关闭链接
2,LOG:输出
 警告信息
3,NOOP:不作任何处理  
4,EXCEPTION:抛出异常 
5,DEAF_SPEAKER:一个特殊的处理,中止当前过滤器对对心跳反馈监听,所以让过滤器丢失请求超时的侦测功能。(让其变成聋子)  
6,keepAliveRequestTimeout(KeepAliveFilter filter, IoSession session);   自定义处理 



下面对客户端与服务端和分别举个例子: 
服务器:
以被动型心跳机制为例,服务器在接受到客户端链接之后被动接受心跳请求,当在规定时间内没有收到客户端心跳请求时 将客户端链接关闭
 
主要代码以下:  
git

KeepAliveMessageFactoryImpl kamfi = new KeepAliveMessageFactoryImpl(); 
        实现 方法: public boolean isRequest(IoSession session, Object message):判断是否心跳请求包  是的话返回true 
                             public boolean isResponse(IoSession session, Object message):因为被动型心跳机制,没有请求固然也就不关注反馈 所以直接返回false
                             
 public Object getRequest(IoSession session): 被动型心跳机制无请求  所以直接返回null
                             
 public Object getResponse(IoSession session, Object request) : 根据心跳请求request 反回一个心跳反馈消息 non-nul 
        说明:  KeepAliveMessageFactoryImpl  为 KeepAliveMessageFactory的一个实现类,其中的实现方法知足被动型心跳机制。
 
spring

KeepAliveFilter kaf = new KeepAliveFilter(kamfi, IdleStatus.BOTH_IDLE);
       说明:实例化一个 
 KeepAliveFilter  过滤器,传入 KeepAliveMessageFactory引用,IdleStatus参数为 BOTH_IDLE,及代表若是当前链接的读写通道都空闲的时候在指定的时间间隔getRequestInterval后发送出发Idle事件。
 
apache

kaf.setForwardEvent(true); //idle事件回发  当session进入idle状态的时候 依然调用handler中的idled方法
      说明:尤为 注意该句话,使用了
 KeepAliveFilter以后,IoHandlerAdapter中的 sessionIdle方法默认是不会再被调用的! 因此必须加入这句话 sessionIdle才会被调用
 
api

kaf.setRequestInterval(heartPeriod);  //本服务器为被定型心跳  即须要每10秒接受一个心跳请求  不然该链接进入空闲状态 而且发出idled方法回调
      说明:设置心跳包请求时间间隔,其实对于被动型的心跳机制来讲,设置心跳包请求间隔貌似是没有用的,由于它是不会发送心跳包的,可是它会触发
 sessionIdle事件, 咱们利用该方法,能够来判断客户端是否在该时间间隔内没有发心跳包,一旦 sessionIdle方法被调用,则认为 客户端丢失链接并将其踢出 。所以其中参数 heartPeriod其实就是服务器对于客户端的IDLE监控时间。服务器

 

//kaf.setRequestTimeout(5); //超时时间   若是当前发出一个心跳请求后须要反馈  若反馈超过此事件 默认则关闭链接session

acceptor.getFilterChain().addLast("heart", kaf); 
     说明: 该过滤器加入到整个通讯的过滤链中。




客户端: 
客户端会定时发送心跳请求(注意定时时间必须小于,服务器端的IDLE监控时间),同时须要监听心跳反馈,以此来判断是否与服务器丢失链接。对于服务器的心跳请求不给与反馈。
主要代码以下: 

函数

 ClientKeepAliveFactoryImpl ckafi = new ClientKeepAliveFactoryImpl(); 
   实现 方法:     public boolean isRequest(IoSession session, Object message): 服务器不会给客户端发送请求包,所以不关注请求包,直接返回false 
                            public boolean isResponse(IoSession session, Object message):客户端关注请求反馈,所以判断mesaage是不是反馈包
                             
 public Object getRequest(IoSession session): 获取心跳请求包 non-null
                             
 public Object getResponse(IoSession session, Object request) : 服务器不会给客户端发送心跳请求,客户端固然也不用反馈  该方法返回null
      
 说明:  ClientKeepAliveFactoryImpl   KeepAliveMessageFactory的一个实现类。
 
 
 KeepAliveFilter kaf = new KeepAliveFilter(ckafi, IdleStatus.READER_IDLE,KeepAliveRequestTimeoutHandler.CLOSE); 
  说明:实例化一个  KeepAliveFilter  过滤器,传入 KeepAliveMessageFactory引用,IdleStatus参数为 READER_IDLE ,及代表若是当前链接的读通道空闲的时候在指定的时间间隔getRequestInterval后发送出心跳请求,以及发出Idle事件。 KeepAliveRequestTimeoutHandler设置为CLOS代表,当发出的心跳请求在规定时间内没有接受到反馈的时候则调用CLOSE方式 关闭链接 
  
  kaf.setForwardEvent(true); 
  说明:继续调用 IoHandlerAdapter 中的 sessionIdle时间 

  kaf.setRequestInterval(HEART_INTERVAL); 
   说明:设置当链接的读取通道空闲的时候,心跳包请求时间间隔 

  kaf.setRequestTimeout(HEART_TIMEOUT); 
  说明:设置心跳包请求后 等待反馈超时时间。 超过该时间后则调用KeepAliveRequestTimeoutHandler.CLOSE 
 
 
  connector.getFilterChain().addLast("heart", kaf);  
spa

      说明: 该过滤器加入到整个通讯的过滤链中。 

项目地址:http://git.oschina.net/bob4j/spring_mina/tree/master

相关文章
相关标签/搜索