论坛首页 Java企业应用论坛

xsocket nio随笔

浏览 3048 次
精华帖 (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/

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics