设为首页 收藏本站
查看: 601|回复: 0

[经验分享] apache mina 同步接收客户端消息

[复制链接]

尚未签到

发表于 2017-1-7 08:46:52 | 显示全部楼层 |阅读模式
  我们知道,在MINA2中,发送和接受时两个独立的工作线程,但是可以设置一个参数,当服务端发送消息之后同步读取客户端的返回: 
Java代码   DSC0000.png


  • session.getConfig().setUseReadOperation(true);  

  

近日,采用MINA2(RC)的同步读取方法,发现无法真的同步读取客户端的返回; 
场景是:服务端发送一个消息给客户端,需要同步等待客户端的一个消息回执,然后服务端的程序继续执行; 
 
Java代码  


  • sendSession.getConfig().setUseReadOperation(true);  
  •         WriteFuture future = sendSession.write(xmlMsgBean); // 发送数据  
  •         future.awaitUninterruptibly(); // 等待发送数据操作完成  
  •         if (future.getException() != null) {  
  •             throw new AppException(future.getException().getMessage());  
  •         }  
  •         if (future.isWritten()) {  
  •             // 数据已经被成功发送  
  •             logger.debug("数据已经被成功发送");  
  •             ReadFuture readFuture = sendSession.read();  
  •             readFuture.awaitUninterruptibly();  
  •             if (readFuture.getException() != null) {  
  •                 throw new AppException(readFuture.getException().getMessage());  
  •             }  
  •             sendSession.getConfig().setUseReadOperation(false);  
  •             return ((XmlMsgBean) readFuture.getMessage()).getStrErrMsg();  
  •         } else {  
  •             // 数据发送失败  
  •             logger.debug("数据发送失败");  
  •         }  
  •     

  



  后来用GOOGLE搜索了一下,发现在MINA的官网上,老外同样问了一个一模一样的问题,并且提了一个BUG上去,但是目前BUG的状态还是open; 
  https://issues.apache.org/jira/browse/DIRMINA-777 
 
Java代码  


  • I'm attempting to perform a synchronous write/read in a demux-based client application with MINA 2.0 RC1, but it seems to get stuck. Here is my code:   
  •   
  • {code}   
  • public boolean login(final String username, final String password) {   
  •     // block inbound messages   
  •     session.getConfig().setUseReadOperation(true);   
  •   
  •     // send the login request   
  •     final LoginRequest loginRequest = new LoginRequest(username, password);   
  •     final WriteFuture writeFuture = session.write(loginRequest);   
  •     writeFuture.awaitUninterruptibly();   
  •   
  •     if (writeFuture.getException() != null) {   
  •         session.getConfig().setUseReadOperation(false);   
  •         return false;   
  •     }   
  •   
  •     // retrieve the login response   
  •     final ReadFuture readFuture = session.read();   
  •     readFuture.awaitUninterruptibly();   
  •   
  •     if (readFuture.getException() != null) {   
  •         session.getConfig().setUseReadOperation(false);   
  •         return false;   
  •     }   
  •   
  •     // stop blocking inbound messages   
  •     session.getConfig().setUseReadOperation(false);   
  •   
  •     // determine if the login info provided was valid   
  •     final LoginResponse loginResponse = (LoginResponse)readFuture.getMessage();   
  •     return loginResponse.getSuccess();   
  • }   
  • {code}   
  •   
  • I can see on the server side that the LoginRequest object is retrieved, and a LoginResponse message is sent. On the client side, the DemuxingProtocolCodecFactory receives the response, but after throwing in some logging, I can see that the client gets stuck on the call to `readFuture.awaitUninterruptibly() `.   
  •   
  • I can't for the life of me figure out why it is stuck here based upon my own code. I properly set the read operation to true on the session config, meaning that messages should be blocked. However, it seems as if the message no longer exists by time I try to read response messages synchronously.  

  
  
Key: DIRMINA-777  
Type:  Bug  
Status:  Open  
Priority:  Blocker  
Assignee: Unassigned  
Reporter: Matt Huggins  
Votes: 0  
Watchers: 0  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-324901-1-1.html 上篇帖子: Windows环境下安装Apache+PHP 下篇帖子: 网页重定向(iis或者apache)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表