2017-06-23 1 views
0

J'ai créé 2 projets de console C# simples (.net 4.5.2), ajouté le package NetMQ Nuget v4.0.0.1 à chacun, chargé chaque programme séparément Visual Studio 2017 Community Editions, a mis un point d'arrêt sur la ligne 1 contenue dans la méthode de rappel OnReceiveReady, a démarré le programme d'abonné en premier, puis a démarré le programme d'éditeur. L'événement ReceieveReady n'est pas déclenché dans l'abonné. Qu'est-ce que je fais mal? Même si j'ai choisi subSocket.Subscribe (""), je n'ai toujours pas reçu de messages. De plus, supprimer/modifier les HighWatermark Send/Receive n'a pas non plus changé les choses. Merci de votre aide!Impossible d'obtenir ReadyReceive pub-sub pour travailler avec NetMQ 4.x

Voici le code Editeur:

using System; 
using NetMQ; 
using NetMQ.Sockets; 
using System.Threading; 

namespace SampleNQPub 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var addr = "tcp://127.0.0.1:3004"; 

      using (var pubSocket = new PublisherSocket()) 
      { 
       Console.WriteLine("Publisher socket binding."); 
       pubSocket.Options.SendHighWatermark = 10; 
       pubSocket.Bind(addr); 

       for (int i=0; i < 30; i++) 
       { 
        pubSocket.SendMoreFrame("NQ").SendFrame(i.ToString()); 
        Thread.Sleep(1000); 
       } 

       pubSocket.Disconnect(addr); 
      } 
     } 
    } 
} 

Voici le code d'abonné:

using System.Threading; 
using NetMQ; 
using NetMQ.Sockets; 

namespace SampleNQSub 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var addr = "tcp://127.0.0.1:3004"; 

      using (var subSocket = new SubscriberSocket()) 
      { 
       subSocket.ReceiveReady += OnReceiveReady; 
       subSocket.Options.ReceiveHighWatermark = 10; 
       subSocket.Connect(addr); 
       subSocket.Subscribe("NQ"); 

       for (int i=0; i < 20; i++) 
       { 
        Thread.Sleep(1000); 
       } 

       subSocket.Disconnect(addr); 
      } 
     } 

     static void OnReceiveReady(object sender, NetMQSocketEventArgs e) 
     { 
      var str = e.Socket.ReceiveFrameString(); 
     } 
    } 
} 

Répondre

0

Ok, ceci est une question de chasse aux sorcières dans le monde NetMQ et je viens compris. Vous DEVEZ installer un NetMQPoller qui finira par appeler tous les rappels ReceiveReady que vous avez ajoutés (NetMQPoller).

Voici le code corrigé qui sera au moins (c.-à-ReceiveFrameString encore que faire la partie « NQ », mais c'est juste un autre appel de méthode pour fixer) obtenir l'événement ReceiveReady déclenché:

using System.Threading; 
using System.Threading.Tasks; 
using NetMQ; 
using NetMQ.Sockets; 

namespace SampleNQSub 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var addr = "tcp://127.0.0.1:3004"; 

      NetMQPoller poller = new NetMQPoller(); 

      using (var subSocket = new SubscriberSocket()) 
      { 
       subSocket.ReceiveReady += OnReceiveReady; 
       subSocket.Options.ReceiveHighWatermark = 10; 
       subSocket.Connect(addr); 
       subSocket.Subscribe("NQ"); 

       poller.Add(subSocket); 
       poller.RunAsync(); 

       for (int i = 0; i < 20; i++) 
       { 
        Thread.Sleep(1000); 
       } 

       subSocket.Disconnect(addr); 
      } 
     } 

     static void OnReceiveReady(object sender, NetMQSocketEventArgs e) 
     { 
      var str = e.Socket.ReceiveFrameString(); 
      e.Socket.ReceiveMultipartStrings() 
     } 
    } 
} 

J'ai remarqué que les auteurs de NetMQ ont décidé en 4.x de s'occuper en interne de l'objet Context afin que l'utilisateur ne soit pas obligé de le gérer. Ce serait bien aussi qu'ils puissent cacher ce code "polling pump" de l'utilisateur aussi bien pour le cas d'utilisation le plus simple. A titre de comparaison, regardez l'abonné en utilisant NodeJS (avec la bibliothèque zmq) en utilisant l'application console de la console que j'ai publiée ci-dessus (enregistrez ce code sur sub.js et, dans une console Windows, tapez 'node sub. js '):

var zmq = require('zmq'), sock = zmq.socket('sub'); 

sock.connect('tcp://127.0.0.1:3004'); 
sock.subscribe('NQ'); 
console.log('Subscriber connected to port 3004'); 

sock.on('message', function() { 
    var msg = []; 
    Array.prototype.slice.call(arguments).forEach(function(arg) { 
     msg.push(arg.toString()); 
    }); 

    console.log(msg); 
}); 

Alors, où se trouve le mécanisme de pompage de pollen? (Réponse: Je m'en fous, je veux juste que les messages me soient fournis dans un rappel que j'inscris. [De toute évidence, je comprends qu'un NetMQPoller est polyvalent et gère des problèmes plus complexes, mais de base " donnez-moi un message dans un rappel quand il arrive ", ce serait bien si elle était traitée en interne par la bibliothèque.])