Je tente d'effectuer une écriture/lecture synchrone dans une application client basée sur le démultiplexeur avec MINA 2.0 RC1, mais il semble être bloqué. Voici mon code:MINA: Exécution de requêtes d'écriture synchrones/lecture de réponses
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();
}
Je peux voir sur le côté serveur que l'objet LoginRequest est récupéré, et un message est envoyé LoginResponse. Du côté client, le DemuxingProtocolCodecFactory
reçoit la réponse, mais après avoir lancé un enregistrement, je peux voir que le client reste bloqué sur l'appel à readFuture.awaitUninterruptibly()
.
Je ne peux pas, pour la vie de moi, comprendre pourquoi il est coincé ici basé sur mon propre code. Je place correctement l'opération de lecture sur true sur la config de la session, ce qui signifie que les messages doivent être bloqués. Cependant, il semble que le message n'existe plus au moment où j'essaie de lire les messages de réponse de manière synchrone.
Des indices quant à pourquoi cela ne fonctionnera pas pour moi?
Je ne suis pas familier avec MINA, mais juste par curiosité - devez-vous utiliser des contrats à terme si vous faites tout de manière synchrone? –
Je crois que vous devez seulement utiliser des contrats à terme pour lire/écrire de manière synchrone si votre application communique généralement de manière asynchrone, mais a besoin d'un cas particulier à un moment donné de l'application. C'est ce que je tente de faire ici pour la connexion, alors que le reste de ma communication sera géré de manière asynchrone. –