2010-03-31 355 views
1

我試圖在基於demux 2.0 RC1的基於demux的客戶端應用程序中執行同步寫入/讀取,但似乎卡住了。這裏是我的代碼: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並不熟悉,但出於好奇 - 如果您同時做所有事情,您是否必須使用期貨? – 2010-03-31 14:00:14

+0

我相信如果你的應用程序通常是異步通信的,你只需要使用futures來同步讀/寫,但是在應用程序的任何給定點需要特殊情況。這就是我在這裏嘗試登錄的方式,而我的其他通信將被異步處理。 – 2010-03-31 16:31:18

回答

0

這對我不起作用的原因是因爲我的代碼中的其他地方的問題,我愚蠢地忽視實現消息響應編碼器/解碼器。啊。無論如何,我的問題中的代碼儘快解決了問題。

0

我有這個確切的問題。事實證明,這是因爲我正在讀取/寫入IoHandler.sessionCreated()實現中。我將處理過程移至建立連接的線程上,而不是等待未來。

-1

你不能在​​線程使用login()功能:

如果你調用的​​倍率事件功能IoFuture.awaitUninterruptibly()

IoHandler不工作,會被卡住。

你可以在其他線程中調用login(),它會正常工作。

+0

感謝您的回覆!不確定誰低估了你,但如果真的話可能會幫助其他人。不幸的是,我有一段時間沒有觸及此代碼,所以我將無法測試您的答案的有效性。 :) – 2014-02-06 17:07:15