【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”
用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 的心跳推荐是最好在60秒以内
还可以设置链路超时时间
引用来自“把剑觅帝乡”的答案
mina 的心跳推荐是最好在60秒以内
还可以设置链路超时时间
异步的话,架构可能有大的变化,我的模块是一个中间层服务器,对内是服务器,对外是客户端,都用异步的话,返回值是个大问题,必须得借助外部结构(比如一个map)匹配回应到正确的请求,目前是考虑后期引入ActiveMQ来重新架构的