MINA:执行同步写入请求/读取响应
我正在尝试使用 MINA 2.0 RC1 在基于 demux 的客户端应用程序中执行同步写入/读取,但它似乎被卡住了。这是我的代码:
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();
}
我可以在服务器端看到 LoginRequest 对象被检索,并且 LoginResponse 消息被发送。在客户端,DemushingProtocolCodecFactory
接收响应,但在添加一些日志记录后,我可以看到客户端卡在对 readFuture.awaitUninterruptically()
的调用上。
我一生都无法根据我自己的代码弄清楚为什么它被困在这里。我在会话配置中正确地将读取操作设置为 true,这意味着应该阻止消息。但是,当我尝试同步读取响应消息时,该消息似乎不再存在。
有什么线索可以解释为什么这对我不起作用吗?
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:
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();
}
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.
Any clues as to why this won't work for me?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这对我不起作用的原因是因为我的代码中其他地方存在问题,我愚蠢地忽略了实现消息响应编码器/解码器。啊。不管怎样,我问题中的代码在我解决这个问题后就立即生效了。
The reason this wasn't working for me was because of an issue elsewhere in my code where I stupidly neglected to implement the message response encoder/decoder. Ugh. Anyway, the code in my question worked as soon as I fixed that.
我更喜欢这个(克里斯蒂安·穆勒:http://apache-mina.10907.n7.nabble.com/Mina-Client-which-sends-receives-messages-synchronous-td35672.html)
}
和 IoHandler:
}
I prefer this one (Christian Mueller : http://apache-mina.10907.n7.nabble.com/Mina-Client-which-sends-receives-messages-synchronous-td35672.html)
}
and the IoHandler:
}
我遇到了这个问题。事实证明,这是因为我在 IoHandler.sessionCreated() 实现中进行读/写操作。我将处理转移到建立连接的线程上,而不是仅仅等待不久的将来。
I had this exact problem. It turns out that it's because I was doing reads/writes in my IoHandler.sessionCreated() implementation. I moved the processing onto the thread that established the connection, instead of just waiting for the close future.
您不得在
IoHandler
线程中使用login()
函数:如果您在
的覆盖事件函数中调用
,IoFuture.awaitUninterruptically()
>IoHandlerIoHandler 不工作并卡住。
您可以在其他线程中调用
login()
,它将正常工作。You must not use your
login()
function inIoHandler
Thread :If you call
IoFuture.awaitUninterruptibly()
in the override event function ofIoHandler
,IoHandler don't work and get stuck.
You can call
login()
in other Thread and it will be work properly.