mina连接莫名断开,是不是有什么特殊属性要设置?

柳倾城 发布于 2013/01/23 17:17
阅读 5K+
收藏 0

NGINX社区官方微服务训练营,深入了解K8s网络,线上课程+专家答疑,立即加入>>>

用mina做了一个客户端,由于初学和业务的需要,这里采用了同步方式来进行通信。

在和第三方服务器的通信过程中,经常发生超时的现象,经过跟踪调试发现,超时请求发出之前,自己维护的IoSession对象已断开了连接(即isConnected()返回true)。

同样的事情,同事用C++写的客户端,一次断连的情况都没发生过。虽然我在请求发出之前重连了断开的连接,解决了问题,但是还是不解为什么会出现比较频繁的断连,handler里的sessionClosed事件会被触发很多次,客户端亦无主动断开连接的代码。连接的代码如下:

private boolean connect(){
		connector = new NioSocketConnector();
		
		DefaultIoFilterChainBuilder chain = connector.getFilterChain();
		
		chain.addLast("mdc", new MdcInjectionFilter());		
		chain.addLast("codec", new ProtocolCodecFilter(new ATClientCodecFactory(Charset.forName("GB2312")))); 		
		chain.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
		
		chain.addLast("logging", new LoggingFilter()); 
		
		connector.setHandler(new ATClientHandler()); 		         
		
        //ConnectFuture 
        cf = connector.connect(new InetSocketAddress(address, port)); 
        
        // Wait for the connection attempt to be finished.
        cf.awaitUninterruptibly();
        
        if(cf.isConnected()){        
        	session = cf.getSession();
        	//TODO remove idle in 2013-01-22
        	//session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60 * 5);
        }else{
        	//connector.dispose(true);
        	LOGGER.error("连接失败,注销连接器");
        }
        return cf.isConnected();
	}
handler中部分代码:

@Override
	public void sessionCreated(IoSession session) throws Exception {
        // Empty handler
		SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig();
        cfg.setUseReadOperation(true);
        cfg.setWriteTimeout(30);
        cfg.setKeepAlive(true);
        cfg.setSoLinger(0);
        cfg.setTcpNoDelay(true);
    }
	
	@Override
	public void sessionClosed(IoSession session) throws Exception {
		LOGGER.info("session"+session.getId()+" closed from " + session.getRemoteAddress());
	}
欢迎各位来指点迷津,先谢过了

以下是问题补充:

@柳倾城:我的业务是在一个线程里循环去做一件事(通信业务),间隔在30S (2013/01/23 17:30)
加载中
0
平安北京
socket连接超时了吧,mina有默认设置的吧,最好有心跳检测
柳倾城
柳倾城
起初我是做了心跳的,2分钟未有读写发生就请求一次系统时间(有读写发生应该不会超时吧?),是不是这个时间太长?
0
二么
二么

mina 的心跳推荐是最好在60秒以内

还可以设置链路超时时间

0
柳倾城
柳倾城

引用来自“把剑觅帝乡”的答案

mina 的心跳推荐是最好在60秒以内

还可以设置链路超时时间

谢谢回答,可以很确定的说不是心跳的原因啦,因为有时候I/0过后几十毫秒连接就断了,当时是做了重连来消除断连的影响(但是重连的开销比较大,建连接-->签入-->登录,身份认证也很耗时间),等手头的工作告一段落之后,打算用异步的方式来看看有没有这个问题。
异步的话,架构可能有大的变化,我的模块是一个中间层服务器,对内是服务器,对外是客户端,都用异步的话,返回值是个大问题,必须得借助外部结构(比如一个map)匹配回应到正确的请求,目前是考虑后期引入ActiveMQ来重新架构的
0
风无影
mina客户端10s发送心跳仍然没有效果,收到服务器的心跳应答不到几秒就会弹出连接超时
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部