MINA 心跳协议

MINA本身自带了对心跳协议的支持,可以对心跳做出细致的配置,昨天仔细研究了一下MINA的API文档,翻译了一下其中心跳的内容(翻译的不好请大家见谅),做了一个测试例子。和需要用到MINA此功能的同行一起探讨一下。

 

写道
这个IoFilter 对IoEventType. SESSION_IDLE状态发出保持连接的请求,同时发回保持连接请求的响应。
这个过滤器要和IoSessionConfig.setIdleTime(IdleStatus, int)方法配制使用
这个过滤器会自动校正IdleStatus的idleTime。 (例如IdleStatus.READER_IDLE状态和 IdleStatus.WRITER_IDLE状态.) 改变IdleStatus的idleTime会让过滤器出现一些无法预计的行为。请注意任何IoFilter 和 IoHandler绑定了KeepAliveFilter后都不会得到任何的IoEventType.SESSION_IDLE响应,除非你调用 setForwardEvent(boolean)方法,传参true。
实现KeepAliveMessageFactory
如果要使用这个过滤器,你需要提供一些KeepAliveMessageFactory的实现:确定接收到,或者发出的都是心跳消息,或者重新构造一条新的信条消息。

 

 

NameDescriptionImplementation

Active

活跃型
你希望当读取者空闲时发送心跳消息。一旦请求发出,对心跳的响应必须在keepAliveRequestTimeout seconds 的时间内. 接收。否则,指定的KeepAliveRequestTimeoutHandler 类会被调用。如果心跳请求被接收到,它的响应当然会被回复。

Both KeepAliveMessageFactory.getRequest(IoSession) and

KeepAliveMessageFactory.getResponse(IoSession, Object)

must return a non-null.

 

Semi-active

半活跃型
 你希望当读取者空闲时发送心跳消息。然而,你实质上并不在意它是否会得到响应。如果心跳请求被接收,同时他会把回应发回来。

 Both KeepAliveMessageFactory.getRequest(IoSession) and

KeepAliveMessageFactory.getResponse(IoSession, Object)

must return a non-null,
and the timeoutHandler property should be set to KeepAliveRequestTimeoutHandler.NOOP , KeepAliveRequestTimeoutHandler.LOG or

the custom KeepAliveRequestTimeoutHandler implementation

that doesn't affect the session state nor throw an exception.

 

Passive

被动型
 你并不想自己发送心跳请求,但是如果由心跳请求被接收到还是会发响应回去。 KeepAliveMessageFactory.getRequest(IoSession) must return null and KeepAliveMessageFactory.getResponse(IoSession, Object) must return a non-null.
 

Deaf Speaker

聋子型
 当读取者空闲时你希望发出心跳请求,但是你并不希望得到任何反馈。 KeepAliveMessageFactory.getRequest(IoSession) must return a non-null, KeepAliveMessageFactory.getResponse(IoSession, Object) must return null and the timeoutHandler must be set to KeepAliveRequestTimeoutHandler.DEAF_SPEAKER .
 

Silent Listener

沉默监听型
 你不想发出心跳请求,同时你并不想收到任何回应。 Both KeepAliveMessageFactory.getRequest(IoSession) and KeepAliveMessageFactory.getResponse(IoSession, Object) must return null.
写道
请注意你务必正确实现 KeepAliveMessageFactory.isRequest(IoSession, Object) and KeepAliveMessageFactory.isResponse(IoSession, Object)中任何一个你选择实现的方法.
Handling timeout处理超时
KeepAliveFilter 在没有收到心跳消息的响应时,会报告给的KeepAliveRequestTimeoutHandler。默认的处理是 KeepAliveRequestTimeoutHandler.CLOSE,但是你可以调整预设值为:KeepAliveRequestTimeoutHandler.NOOP, KeepAliveRequestTimeoutHandler.LOG或 KeepAliveRequestTimeoutHandler.EXCEPTION,你也可以实现个人的处理类。
特别的 handler: KeepAliveRequestTimeoutHandler.DEAF_SPEAKER
KeepAliveRequestTimeoutHandler.DEAF_SPEAKER 是一个特定的处理方法,专门应对于前面提及过的“deaf speaker”模式。在设置KeepAliveRequestTimeoutHandler.DEAF_SPEAKER的timeoutHandler 时需要停止回应的过滤器,从此去除超时的侦测。

 

以上是MINA的 心跳包API,从文档中可以得知MINA的心跳主要是依赖KeepAliveMessageFactory,和KeepAliveRequestTimeoutHandler的实现。。

 

附上自己测试的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,mina-filter是一个用于Apache MINA(Multipurpose Infrastructure for Network Applications)框架的过滤器。MINA是一个基于Java的网络应用程序框架,用于开发高性能和可扩展的网络应用程序。 MINA框架使用过滤器链来处理输入和输出数据。过滤器链由多个过滤器组成,每个过滤器负责处理特定的任务,例如数据压缩、数据加密、协议解析等。过滤器链可以根据应用程序的需求进行配置和定制。 以下是一个使用mina-filter的示例: ```java import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.filterchain.IoFilterAdapter; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.logging.LoggingFilter; public class MinaFilterExample { public static void main(String[] args) { // 创建过滤器链 DefaultIoFilterChainBuilder filterChain = new DefaultIoFilterChainBuilder(); // 添加日志过滤器 filterChain.addLast("logger", new LoggingFilter()); // 添加协议编解码过滤器 filterChain.addLast("codec", new ProtocolCodecFilter(new MyProtocolCodecFactory())); // 添加自定义过滤器 filterChain.addLast("myFilter", new MyFilter()); // 创建MINA服务器 NioSocketAcceptor acceptor = new NioSocketAcceptor(); acceptor.setFilterChainBuilder(filterChain); // 启动服务器 try { acceptor.bind(new InetSocketAddress(8888)); System.out.println("Server started on port 8888"); } catch (IOException e) { e.printStackTrace(); } } // 自定义协议编解码工厂 private static class MyProtocolCodecFactory implements ProtocolCodecFactory { // 实现编解码逻辑 // ... } // 自定义过滤器 private static class MyFilter extends IoFilterAdapter { @Override public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception { // 处理接收到的消息 // ... } @Override public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception { // 处理发送的消息 // ... } } } ``` 上述示例中,我们创建了一个MINA服务器,并配置了一个过滤器链。过滤器链包括日志过滤器、协议编解码过滤器和自定义过滤器。日志过滤器用于记录日志信息,协议编解码过滤器用于处理数据的编码和解码,自定义过滤器用于处理接收和发送的消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值