浏览 3048 次
锁定老帖子 主题:xsocket nio随笔
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-25
问题从xfire的异常开始 webservice一直也没出过问题,但是最近接口数据量变大,总频繁的偶尔抛出异常,无奈 1)对比xfire jar包,是否有少了或者版本太低或者太高,无果 2)搜索网上的一些解决办法,无果 问题连接http://www.iteye.com/problems/39873 无奈改由socket通讯,采用xsocket,只有一个jar包,实在忍受不了像mina那么多jar,怕对现有的lib库有冲突。 xsocket使用简单,10分钟就能搭建好。 OK,采用短连接,发送完数据后就关闭连接,服务器端采用NIO方式接收。 本地测试OK,可能还是测试不够,一放到现场,问题来了,数据量处理过大,经常出现本地已经发送成功,对端确没有收到数据,日志没有显示,本地也一点异常没有,日志打印发送成功。 第一反应是线程池开的不够大,后加大线程池,并用了LinkedBlockingQueue排队,还是不能解决,后仔细研究了下NIO机制,原因大致为: 举个例子: NIO通讯好比送包裹,当一个包裹过来,送到,并要签收。 偶的短连接,就是包裹送到,但是没有签收,就断开连接了,本地只认为包裹送到了,至于是否签收他就不关心了,所以本地就不会抛出异常。 xsocket NIO构造的服务器端,selector负责接收read channel,默认是2个,当你设置了setWorkerpool(20),20个线程用完,那么channel只能等待,客户端就会认为包裹送到了,等有空闲线程之后,read channel由于客户端连接关闭,也就不会读到任何数据。 明白之后改进也就简单,短连接发送数据后,一定要得到返回值才认为数据接收成功,再关闭连接。 可能有理解不当之处,还望牛人指出,一些细节并没有去深究。 希望对大家设计接口协议有一定帮助。 相关文章 http://www.blogjava.net/adapterofcoms/articles/314560.html http://xsocket.sourceforge.net/ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |