用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());
} 欢迎各位来指点迷津,先谢过了
MINA
mina 的心跳推荐是最好在60秒以内
还可以设置链路超时时间
引用来自“把剑觅帝乡”的答案
mina 的心跳推荐是最好在60秒以内
还可以设置链路超时时间
异步的话,架构可能有大的变化,我的模块是一个中间层服务器,对内是服务器,对外是客户端,都用异步的话,返回值是个大问题,必须得借助外部结构(比如一个map)匹配回应到正确的请求,目前是考虑后期引入ActiveMQ来重新架构的