2011-11-23 51 views
3

與boost.asio不同,netty沒有類似於讀取的方法。在以下情況下不方便: 管理節點管理一些節點,客戶端連接管理節點以檢索駐留在節點中的信息。當管理節點接收到客戶端的請求時,它向相應節點發送一個請求並等待節點響應。當節點響應和管理節點在其'messageReceived'函數中獲取信息時,如何將信息發送到屬於客戶端的通道?它需要發送一個事件給客戶端請求的Handler。如何將事件發送到netty中的其他處理程序?

1.get客戶機請求

2.發送請求至節點

3.read該節點的響應

4.send響應於客戶端

所有這些4步驟可以在boost.asio中的一個函數中完成。但netty不支持step3,讀取功能是獨立的,用戶不能直接調用它。唯一的方法是在管理節點和節點之間的處理程序中收到響應後,將其重新發送到管理節點和客戶機之間的處理程序。 這樣做的典型方法是什麼?

回答

3

Netty的使用異步I/O操作,因此第2步是異步,是的,你不能阻止,直到你得到第3步

在大多數情況下是這樣,(不是特定於Netty的),你可以做的是:
1)爲你的請求提供唯一的ID,節點應該在迴應中回顯唯一的ID。
2)將它們存儲在散列表中,並將其作爲請求和通道(管理節點和客戶端之間)的唯一標識作爲其值
3)當您收到管理節點中節點的響應時,可以從中查找通道hashmap使用唯一的id,然後將響應發送給客戶端。

你也可以看看Bruno de carvalho的Netty load balancer,它會給你另一個觀點來看同一個問題。他使用隧道來達到相同的效果。

+0

我把客戶端的通道ID放入從管理節點發送到節點的包中,所以當節點響應時,我知道應該使用哪個客戶端通道。 – jean

+0

我想有一些實用程序或典型的技巧可以解決這個問題。順便說一句,我覺得netty的設計理念是某種限制。事實上,我說的4個步驟可以在異步中完成,asio通過完整的回調處理程序鏈來完成。 – jean

+0

在netty中,channel.write()將爲您提供一個ChannelFuture。你可以爲這個未來的對象添加一個FutureListener,也就是一個回調函數,所以你在Netty中也有類似的功能。所以你可以在第二步等待,或者在結尾做一些邏輯,但第三步來自客戶端,所以這個回調不會有幫助。 – Abe

相關問題