MINA2的一个BUG

我们知道,在MINA2中,发送和接受时两个独立的工作线程,但是可以设置一个参数,当服务端发送消息之后同步读取客户端的返回:
session.getConfig().setUseReadOperation(true);


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

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;
[url]https://issues.apache.org/jira/browse/DIRMINA-777[/url]
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值