以前写了一篇介绍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网站看原创,谢谢!