2012-01-06 51 views
0

沒有人有展示 如何網狀3.2.7要正確處理在以下情況下SQL查詢一個簡單的代碼示例:正確的方式來等待SQL I/O完成

調用方法將消息傳遞到服務器messageReceived 方法。 messageRecieved方法執行sql查詢並獲得 結果。調用方法不應繼續處理,直到 獲得sql查詢的結果。

特別是,netty等待 I/O(SQL查詢)完成的方式的示例非常有用。

回答

0

您需要在執行sql查詢的處理程序前添加一個ExecutionHandler。完蛋了......

否則,你會擋住你的工作線程

+0

感謝您的回覆。但是,它並沒有回答關於 netny如何正確等待sql的結果並且 將其返回給調用方法的觀點。 否則調用方法繼續執行之前,它的結果來自於 sql(並且它需要結果正確進展)。 – Ray 2012-01-06 16:44:02

+0

我認爲它會回答問題,因爲處理程序後面的其他「處理程序」會調用sql,只有在sql代碼完成之後纔會執行。所以我認爲它是你想要的,還是我錯過了解它? 檢出:http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/execution/ExecutionHandler.html – 2012-01-06 19:09:55

0

諾曼感謝的額外信息。這我認爲這可以解決問題,但它涉及到添加一個額外的處理程序,這是不是真正需要的,並將純粹添加以確保SQL查詢已完成(沒有功能)。

我找了一個「更加標準」的方法,找到了鏈接 「http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/ChannelFuture.html」,裏面寫着「提供了各種方法讓您檢查I/O操作是否已完成,等待完成並檢索I/O操作的結果,還允許您添加ChannelFutureListeners,以便在I/O操作完成....「

它也說優先addListener(ChannelFutureListener)await(),但我不知道如何實現這一點。 如果有人知道如何實現這個功能來等待I/O sql查詢的結果,那麼這將非常有用。

爲了解決中的sendMessage方法的問題我用

lastWriteFuture = connector.write(message); 
if (lastWriteFuture != null) { 
     lastWriteFuture.awaitUninterruptibly(); 
} 

這工作 - 等待SQL查詢完成,然後retuns給調用者。

+0

啊是啊這工作..我以爲你想等待的SQL從io線程內完成。在io線程中,您無法調用await *(),因爲它會死鎖。 – 2012-01-07 16:46:26