2010-03-31 7 views
1

Я пытаюсь выполнить синхронную запись/чтение в клиентском приложении на основе demux с MINA 2.0 RC1, но, похоже, он застрял. Вот мой код:MINA: Выполнение синхронных запросов на запись/чтение ответов

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 в конфигурации сеанса, что означает, что сообщения должны быть заблокированы. Однако, похоже, что сообщение больше не существует по времени, я пытаюсь синхронно читать ответные сообщения.

Любые подсказки относительно того, почему это не сработает для меня?

+0

Я не знаком с MINA, но просто из любопытства - вам нужно использовать фьючерсы, если вы все делаете синхронно? –

+0

Я считаю, что вам нужно использовать только фьючерсы для синхронного чтения/записи, если ваше приложение обычно передает асинхронно, но для конкретного случая в приложении требуется специальный случай. Вот что я пытаюсь сделать для входа в систему, тогда как остальное мое сообщение будет обрабатываться асинхронно. –

ответ

0

Причина, по которой это не работало для меня, вызвано проблемой в другом месте моего кода, где я глупо пренебрегал внедрением кодера/декодера ответа сообщения. Тьфу. Во всяком случае, код в моем вопросе работал, как только я исправил это.

0

У меня была эта точная проблема. Оказывается, это потому, что я делал чтение/запись в моей реализации IoHandler.sessionCreated(). Я переместил обработку на поток, который установил соединение, вместо того, чтобы просто ждать ближайшего будущего.

-1

Вы не должны использовать login() функции IoHandler Темы:

При вызове IoFuture.awaitUninterruptibly() в функции события переопределения IoHandler,

IOHandler не работает и застревает.

Вы можете позвонить в login() в другой теме, и это будет нормально работать.

+0

Спасибо за ответ! Не уверен, кто вас подал, но это может помочь кому-то другому, если это правда. К сожалению, я не коснулся этого кода за какое-то время, поэтому я не смогу проверить правильность вашего ответа. :) –