2010-03-31 7 views
1

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?

+0

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? –

+0

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. –

Répondre

0

La raison pour laquelle cela ne fonctionnait pas pour moi était à cause d'un problème ailleurs dans mon code où j'ai bêtement négligé d'implémenter le codeur/décodeur de réponse de message. Pouah. Quoi qu'il en soit, le code de ma question a fonctionné dès que j'ai corrigé cela.

0

J'ai eu ce problème exact. Il s'avère que c'est parce que je faisais des lectures/écritures dans mon implémentation de IoHandler.sessionCreated(). J'ai déplacé le traitement sur le thread qui a établi la connexion, au lieu d'attendre le futur proche.

-1

Vous ne devez pas utiliser votre fonction login() dans IoHandler Discussion:

Si vous appelez IoFuture.awaitUninterruptibly() dans la fonction d'événement de substitution de IoHandler,

IOHandler ne fonctionnent pas et se coincer.

Vous pouvez appeler login() dans un autre thread et il fonctionnera correctement.

+0

Merci pour la réponse! Je ne sais pas qui vous a rabaissé, mais cela pourrait aider quelqu'un d'autre si c'est vrai. Malheureusement, je n'ai pas touché à ce code depuis un certain temps, donc je ne pourrai pas tester la validité de votre réponse. :) –

Questions connexes