2011-11-23 2 views
3

Contrairement à boost.asio, netty n'a pas de méthode de lecture. Il n'est pas pratique dans les situations suivantes: Un nœud de gestion gère certains nœuds et les clients se connectent au nœud de gestion pour récupérer les informations résidant dans les nœuds. Lorsque le noeud de gestion reçoit la requête du client, il envoie une requête au noeud correspondant et attend la réponse du noeud. Lorsque le nœud de gestion et de réponse du nœud obtient l'information dans sa fonction 'messageReceived', comment envoyer l'information au canal qui appartient au client? Il doit envoyer un événement à Handler de la demande du client.Comment envoyer un événement à un autre gestionnaire dans Netty?

requête de client 1.get

2.ENVOI demande à un noeud

réponse 3.read de ce noeud

4.send réponse au client

tous ces quatre étapes peut être fait dans une fonction dans boost.asio. Mais netty ne supporte pas l'étape 3, la fonction de lecture est indépendante, l'utilisateur ne peut pas l'appeler directement. La seule façon est après avoir reçu la réponse dans le gestionnaire entre le noeud de gestion et le noeud, renvoyez-le à gestionnaire entre le noeud de gestion et le client. Quelle est la manière typique de faire ceci?

Répondre

3

Netty utilise async i/opérations o Étape donc 2 est async et oui, vous ne pouvez pas bloquer jusqu'à ce que vous obtenez l'étape 3.

Dans la plupart des cas comme celui-ci, (non spécifique à Netty) ce que vous pouvez faire est:
1) fournir des identifiants uniques à vos demandes, les nœuds sont censés renvoyer les identifiants uniques dans leurs réponses.
2) Stockez-les dans un hashmap avec la clé comme identifiant unique de demande et canal (entre le noeud de gestion et le client) comme valeur
3) Lorsque vous recevez la réponse du noeud dans le noeud de gestion, vous pouvez rechercher le canal hashmap utilisant un identifiant unique, puis envoie la réponse au client.

Vous pouvez également jeter un oeil à Netty load balancer de Bruno de carvalho qui vous donnera une autre perspective à la même question. Il utilise le tunnel pour obtenir le même effet.

+0

Je mets l'identification de canal du client dans le paquet envoie du noeud de gestion au noeud, ainsi quand la réponse de noeud, je sais que le canal de client que je devrais employer. – jean

+0

Je suppose qu'il y a quelques utilitaires ou astuce typique pourrait résoudre ce problème. BTW, je pense que la philosophie de conception de Netty est une sorte de restriction. En fait, les 4 étapes que j'ai dites pourraient aussi être faites en async, aussi bien par chaîne de gestionnaires de callback complets. – jean

+0

Dans netty, channel.write() vous fournira un ChannelFuture. Vous pouvez ajouter un FutureListener à cet objet futur, c'est-à-dire un callback de sorte que vous ayez également des fonctionnalités similaires dans Netty. Donc, vous pouvez attendre à l'étape 2, ou faire de la logique à la fin, mais l'étape 3 vient du client, donc ce rappel n'aidera pas. – Abe

Questions connexes