Hautement HTTP simultanés avec Netty et NIO
Je suis en train de travailler à travers les exemple Netty HTTP code Client afin de faire une requête http à l'intérieur d'un concurrent, fileté de l'environnement.
Cependant, mon système se casse complètement (avec un tas d'exceptions) à assez faible débit.
Dans près de pseudo-code:
ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory())
bootstrap.setPipelineFactory(new HttpClientPipelineFactory());
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
Channel channel = future.awaitUninterruptibly().getChannel();
HttpRequest request = new DefaultHttpRequest();
channel.write(request);
Dans l'exemple, pour faire une demande, je créer un ClientBootstrap, et à partir de là (à travers quelques cerceaux) un Canal d'écrire HTTPRequest.
Tout cela fonctionne et il est bon.
Cependant, dans le même temps une situation, à chaque demande de passer par la même épreuve? Je pense que c'est ce qui est en train de briser des choses pour moi en ce moment. Devrais-je être à la réutilisation de la connexion ou de structuration de mon client d'une manière entièrement différente?
Aussi: je suis en train de faire cela en Clojure, si cela fait toute la différence.
avez-vous une expérience avec aleph? J'ai essayé une autre async clojure client http, mais il ne fonctionne pas sur les niveaux de débit j'ai besoin de la soutenir.
OriginalL'auteur Toby Hede | 2011-03-28
Vous devez vous connecter pour publier un commentaire.
Pas, vous êtes bien faire les choses. Vous devez, cependant, de conserver une référence à votre
Channel
instance. Une fois que vous avez ce canal, aussi longtemps qu'il est ouvert, vous n'avez pas besoin de créer un autre fichier d'amorçage. (Si c'est ce que vous faites.)C'est ce que j'ai utilisé dans un projet récent :
classe ClientConnection (constructeur)
classe ClientConnection.connect(String host, int port)
Donc, fondamentalement, je ne garde que d'une référence à
bootstrap
etchannel
, cependant l'ancien est quasiment pas utilisée à l'extérieur de ces lignes de code.Remarque: vous ne devez exécuter
bootstrap.releaseExternalResources();
une fois, lorsque l'application est sortie. Dans mon cas, le client envoie des fichiers, puis fermer le canal et la sortie.Une fois que vous avez connecté
Channel
exemple, il vous suffit d'utiliser celui-ci jusqu'à ce que vous fermez à nouveau. Une fois qu'il est fermé, vous pouvez rappeler lebootstrap
pour créer un nouveauChannel
de nouveau.Personnellement, je trouve Netty un peu dur à comprendre au début, mais une fois que vous comprendre comment ça fonctionne, c'est tout simplement le meilleur NIO cadre en Java. L'OMI.
bootstrap
sera également utile si vous voulez vous faire une autre connexion et utiliser les mécanismes existants (sous-jacent Netty NIO threads de travail).OriginalL'auteur Yanick Rochon