2011-11-23 102 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

相关问题