`
cuisuqiang
  • 浏览: 3934677 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3649438
社区版块
存档分类
最新评论

Mina重连 千万别这么干

阅读更多

以前写了一篇介绍Mina简单示例的文章:Mina TCP服务端客户端 示例

在初始化客户端连接的时候,我是在构造方法里面写的:

public MinaTcpClient() {
	connector = new NioSocketConnector();
	connector.setHandler(this);
	ConnectFuture connFuture = connector.connect(new InetSocketAddress("localhost", MinaTcpServer.PORT));
	connFuture.awaitUninterruptibly();
	session = connFuture.getSession();
	System.out.println("TCP 客户端启动");
}

 

那客户端会有中断的情况,那就得重连吧,怎么重连,马上想到的就是不断创建MinaTcpClient对象,或者把Mina的对象都重新创建一次。

是的,我就是这么干的,当时确实没注意。后来发现,总是死机,现象是Tomcat没有死,而是该程序宕机了。

我开始认为是其他问题,后来使用JDK自带的jconsole查看(如果默认安装,路径是C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe),发现对象一直在无限制增加,而内存和CPU却没有太多的变化,加上每次都是服务端宕机时这边才会出现宕机,我在想应该就是不断重连带来的问题。

我尝试把一些方法内的变量提取到类里面,使用时再进行NEW操作,可是仍然不能解决问题。偶然看到NioSocketConnector这个对象,联想到JDBC连接池,我貌似找到了问题的所在。

于是我把NioSocketConnector实例对象单例化,只是通过NioSocketConnector对象的connect方法不断获取ConnectFuture然后来获得会话,等于整个过程我不会自己去NEW对象。

测试后发现问题解决。

这里就先说一下问题现象和问题是怎么解决的吧,后续我们再继续讨论这个问题。

 

请您到ITEYE网站看原创,谢谢!

http://cuisuqiang.iteye.com/ ! 

自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!

3
3
分享到:
评论
6 楼 davidafairy 2015-09-06  
connector.setHandler中
        if (isActive()) {
            throw new IllegalStateException("handler cannot be set while the service is active.");
        }

单例有会有如上代码限制 不敢直接注释掉 怕有后患。楼主有什么想法?
5 楼 davidafairy 2015-09-06  
把NioSocketConnector实例对象单例化,只是通过NioSocketConnector对象的connect方法不断获取ConnectFuture然后来获得会话,等于整个过程我不会自己去NEW对象

能贴下这段代码吗?谢谢
4 楼 s33ker 2014-08-08  
http://www.oschina.net/question/1168562_164367
帮看下这个问题吧
3 楼 lanqiu17 2014-02-12  

对啊,我们没有对数据分包,直接传输的数据对象。这个把我头都搞大了,我再去看看怎么分包, 谢谢
2 楼 cuisuqiang 2014-02-12  
lanqiu17 写道
楼主,请问使用mina传输大数据总是 报连接超时怎么处理?
谢谢

是不是因为数据量大引起了网络堵塞?那就需要分包了
1 楼 lanqiu17 2014-02-11  
楼主,请问使用mina传输大数据总是 报连接超时怎么处理?
谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics