2

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メッセージが送信されていることがわかります。クライアント側では、DemuxingProtocolCodecFactoryは応答を受信しますが、ログをスローした後、クライアントがへの呼び出しでスタックしていることがわかりますreadFuture.awaitUninterruptibly()

私自身のコードに基づいて、なぜそれがここで立ち往生しているのか理解することはできません。セッション構成で読み取り操作をtrueに適切に設定しました。これは、メッセージをブロックする必要があることを意味します。しかし、応答メッセージを同期的に読み取ろうとすると、メッセージが存在しなくなったように見えます。

なぜこれがうまくいかないのかについての手がかりはありますか?

4

4 に答える 4

1

これがうまくいかなかった理由は、メッセージ応答エンコーダー/デコーダーの実装を愚かに怠ったコードの他の場所の問題が原因でした。うーん。とにかく、私の質問のコードは、それを修正するとすぐに機能しました。

于 2010-08-01T20:03:25.420 に答える
0

私はこの正確な問題を抱えていました。IoHandler.sessionCreated() 実装で読み取り/書き込みを行っていたためであることが判明しました。近い将来を待つのではなく、接続を確立したスレッドに処理を移しました。

于 2010-08-17T18:32:28.807 に答える
-1

Threadlogin()で関数を使用しないでください。IoHandler

IoFuture.awaitUninterruptibly()のオーバーライドイベント関数を呼び出すとIoHandler

IoHandler が機能せず、スタックします。

login()他のスレッドを呼び出すと、正常に動作します。

于 2014-02-06T13:58:11.953 に答える