mina 心跳 时间间隔 失效 和 心包,断线重连的问题

原创 2018年04月17日 17:40:54

mina 心跳 时间间隔 失效


重连的时候有时候 会导致 时间间隔 失效,重新设置了

keepAliveFilter

也不行,

日志

I/KeepAliveFilter: 间隔时间是1

I/KeepAliveFilter: message sent5465-6041 msg= ping
I/KeepAliveFilter: message write5465-6041
I/KeepAliveFilter: 间隔时间是1
I/KeepAliveFilter: message sent5465-6041 msg= ping
I/KeepAliveFilter: message write5465-6041
I/KeepAliveFilter: 间隔时间是1

I/KeepAliveFilter: message sent5465-6041 msg= ping


 \mina_push\src\main\java\org\apache\mina\filter\keepalive\KeepAliveFilter.java


    @Override
    public void messageSent(IoFilter.NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
        Object message = writeRequest.getMessage();
        Log.i(this.getClass().getSimpleName(),"间隔时间是" + requestInterval);
        Log.i(this.getClass().getSimpleName(), "message sent"+android.os.Process.myPid()+'-'+android.os.Process.myTid() + " msg= " + message);
//        if (!isKeepAliveMessage(session, message)) {
        nextFilter.messageSent(session, writeRequest);
//        }
    }
其中的属性是


private volatile int requestInterval;

private volatile int requestTimeout;

估计是 volatile 导致的


有文章提到


方法1.不可行  synchronize

如何解决volatile的线程安全问题

      解决线程安全问题,不要忘了开篇时候说道的原子性,多线程会有问题,我们是否可以让它实现原子性的操作??当然可以,就是我们的synchronize关键字,在多个线程对同一个变量进行访问时,做一下控制,只让一个线程来操作,这样就不会出现线程安全问题;最典型的操作:

     单例模式中的双重校验!

    到这里就基本结束了,不知道小编的这些见解有没有帮你解答心中的疑惑呢?



方法二  可行,判断下  equestInterval,如果<30  >100 设置为60 即可


    @Override
    public void messageSent(IoFilter.NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
        Object message = writeRequest.getMessage();
        Log.i(this.getClass().getSimpleName(),"间隔时间是" + requestInterval);
        // modied by yanggg 18 04 17
        if(requestInterval < 10 || requestInterval>100){
            requestInterval = 60;
            requestTimeout  = 30;
        }
        Log.i(this.getClass().getSimpleName(), "message sent"+android.os.Process.myPid()+'-'+android.os.Process.myTid() + " msg= " + message);
//        if (!isKeepAliveMessage(session, message)) {
        nextFilter.messageSent(session, writeRequest);
//        }
    }


======测试结果=======

I/KeepAliveFilter: message write2899-3343

I/KeepAliveFilter: 间隔时间是1
I/KeepAliveFilter: message sent2899-3343 msg= ping
I/KeepAliveFilter: message write2899-3343
I/KeepAliveFilter: 间隔时间是60
I/KeepAliveFilter: message sent2899-3343 msg= ping


===========================================================




第二个问题 。断线重连的方式 2种


第一种重连的方式

       //      断线重连回调拦截器
        connector.getFilterChain().addFirst("reconnection", new IoFilterAdapter() {
            @Override
            public void sessionClosed(NextFilter nextFilter, IoSession ioSession) throws Exception {
                for(;;){
                    try{
                        Thread.sleep(8000);
                        // 因为是多线程 有可能其他线程已经重新连接了
                        // TODO 有时候 重连后ping的时间间隔会变成很短,估计是重连了2个连接导致的错误
                        if (!session.isConnected()){

                            //有时候心跳的设置会丢失
                            //初始化心跳
                            //if (keepAliveFilter == null) {

                           // }
                            //keepAliveFilter = new KeepAliveFilter(new ClientKeepAliveMessageFactoryImp(),
                           //         IdleStatus.READER_IDLE,
                           //         KeepAliveRequestTimeoutHandler.DEAF_SPEAKER,
                           //         heartBeatInterval,
                           //         Config.KEEP_ALIVE_RESPONSE_TIMEOUT);
                           // Log.i(TAG, "心跳间隔重新设置为" + heartBeatInterval + "超时时间:" + Config.KEEP_ALIVE_RESPONSE_TIMEOUT);

                            //替换掉原来的
                            connector.getFilterChain()
                                    .replace("keepalive", keepAliveFilter);

                            ConnectFuture future = connector.connect();
                            future.awaitUninterruptibly();// 等待连接创建成功
                            session = future.getSession();// 获取会话
                            if(session.isConnected()){
                                Log.i(TAG,"reconnection 断线重连["+ connector.getDefaultRemoteAddress().getHostName() +":"+ connector.getDefaultRemoteAddress().getPort()+"]成功");
                                break;
                            }
                        }

                    }catch(Exception ex){
                        Log.i(TAG, "reconnection 重连服务器登录失败,3秒再连接一次:"  + ex.getMessage());


                    }
                }
            }
        });


第二种方式
connector.addListener(new IoListener() {
            @Override
            public void sessionDestroyed(IoSession arg0) throws Exception {
                for (;;) {
                    try {
                        Thread.sleep(9000);
                        //因为是多线程 有可能其他线程已经重新连接了
                        if (!session.isConnected()){
                            ConnectFuture future = connector.connect();
                            future.awaitUninterruptibly();// 等待连接创建成功
                            session = future.getSession();// 获取会话
                            if (session.isConnected()) {
                                Log.i(TAG,"addListener IoListener  断线重连[" + connector.getDefaultRemoteAddress().getHostName() + ":" + connector.getDefaultRemoteAddress().getPort() + "]成功");
                                break;
                            }
                        }
                    } catch (Exception ex) {
                        Log.i(TAG,"addListener IoListener 重连服务器登录失败,3秒再连接一次:" + ex.getMessage());
                    }
                }
            }
        });

package com.andy.mina_push.nat;

/**
 * Created by win on 2018/4/15.
 */
import org.apache.mina.core.service.IoService;
import org.apache.mina.core.service.IoServiceListener;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

public class IoListener implements IoServiceListener{
    @Override
    public void serviceActivated(IoService arg0) throws Exception {
        // TODO Auto-generated method stub
    }
    @Override
    public void serviceDeactivated(IoService arg0) throws Exception {
        // TODO Auto-generated method stub
    }
    @Override
    public void serviceIdle(IoService arg0, IdleStatus arg1) throws Exception {
        // TODO Auto-generated method stub
    }
    @Override
    public void sessionCreated(IoSession arg0) throws Exception {
        // TODO Auto-generated method stub
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {

    }

    @Override
    public void sessionDestroyed(IoSession arg0) throws Exception {
        // TODO Auto-generated method stub
    }
}



JavaSE案例--四连棋游戏--位运算

传统的四连棋算法,使用的是两维数组的方式,这种算法非常的复杂和繁琐。 这套视频,采用位运算,& | << |= 等进行四连棋的游戏开发,运算性能非常快。 这是位运算使用的经典案例!(本套视频只提供算法分析代码,不提供项目演示代码)
  • 2016年10月22日 13:00

mina 心跳包,断线重连的问题

mina自带了心跳包机制,我是每隔15秒发送一次心跳包,若30秒内没有收到,则认为超时。 网络连接的主题函数是: /** * 30秒后超时 */ private st...
  • sangsa
  • sangsa
  • 2016-05-21 20:02:36
  • 7212

Mina 断线重连机制

Mina 断线重连     定义:这里讨论的Mina 断线重连是指使用mina作为客户端软件,连接其他提供Socket通讯服务的服务器端。Socket服务器可以是Mina提供的服务器,也可以是C...
  • u013614451
  • u013614451
  • 2014-10-26 21:12:21
  • 2802

MINA断线重连死锁解决

  • 2017年08月21日 14:36
  • 24.01MB
  • 下载

Mina 断线重连 - 解决方案

Mina 断线重连         说明:本文出处:http://chwshuang.iteye.com/blog/2028951  来源是我本人在iteye服务器上的原创文章。        ...
  • chwshuang
  • chwshuang
  • 2016-03-31 10:08:13
  • 5346

互联网的长在线、心跳和断线重连

概述     目前IM软件有一个基本的功能就是长在线,即只要有网络就保持登录,然而,网络状态是无法预测的,所以IM软件经常会有”离线“状态,尤其是手机客户端。长在线这个功能依赖断线重连完成。     ...
  • kobejayandy
  • kobejayandy
  • 2015-06-30 22:15:57
  • 2971

stock mina框架,自动重连

最近在研究stock 通讯看到mina框架使用起来实在是太简单了,想和大家一起分享一下,多多学习! 贴上主要代码大家可以看一下: package com.org.mina; import...
  • zx302560625
  • zx302560625
  • 2014-12-08 15:41:18
  • 656

mina作为客户端断线重连

http://chwshuang.iteye.com/blog/2028951 定义:这里讨论的Mina 断线重连是指使用mina作为客户端软件,连接其他提供Socket通讯服务的服务器端。So...
  • cao478208248
  • cao478208248
  • 2014-12-01 16:26:16
  • 2777

长连接、心跳和断线重连

一、概述         目前IM软件有一个基本的功能就是长在线,即只要有网络就保持登录,然而,网络状态是无法预测的,所以IM软件经常会有”离线“状态,尤其是手机客户端。长在线这个功能依赖断线重...
  • u012692537
  • u012692537
  • 2017-06-22 18:38:53
  • 1426

Mina 断线重连(作为客户端时)

xxx
  • smithdoudou88
  • smithdoudou88
  • 2015-05-27 09:50:48
  • 841
收藏助手
不良信息举报
您举报文章:mina 心跳 时间间隔 失效 和 心包,断线重连的问题
举报原因:
原因补充:

(最多只允许输入30个字)