2017-01-11 1 views
0

Je me demandais s'il y a un moyen de déclencher des événements sur un nouvel abonnement à une prise éditeurZeroMQ socket éditeur - événement lever sur abonnement

Par exemple:

 PublisherSocket publisher = new PublisherSocket(); 

     publisher.Bind("tcp://*:5555"); 

     NetMQPoller poller = new NetMQPoller { publisher }; 
     poller.RunAsync(); 

     poller.OnSubscription += topic => 
     { 
      AddToPool(topic); 
     }; 

     Task.Factory.StartNew(() => 
     { 
      SubscriberSocket sub = new SubscriberSocket(); 
      sub.Connect("tcp://127.0.0.1:5555"); 

      Thread.Sleep(1000); 
      sub.Subscribe("A"); 
     }, TaskCreationOptions.LongRunning); 

     publisher.ReceiveReady += Publisher_ReceiveReady; 

Bien sûr, OnSubscription doesn Je n'existe pas vraiment, mais je me demandais s'il y avait un moyen de le contourner.

J'ai besoin que mon serveur prenne connaissance de tous les abonnements.

Je pensais environ deux façons de la mettre en œuvre:

  1. Créer une prise de routeur supplémentaire sur le serveur, tous les abonnements seront envoyés à la fois à la prise de l'éditeur et à la prise de routeur (désabonnements ainsi). Cela me permettra d'interroger les abonnements du routeur. Ne pas utiliser éditeur/abonné du tout, créer tout le mécanisme pubsub avec routeur/revendeur.

Que me suggérez-vous de faire?

+0

Comme indiqué dans le guide zeroMQ, il n'est pas possible de suivre les abonnements, mais de consulter [Advanced Pub-Sub-Pattern] (http://zguide.zeromq.org/page:all#Reliable-Pub-Sub -Clone-Pattern), vous trouverez un modèle fiable-Pub-Sub (Clone), qui utilise une seconde prise ROUTER/DEALER pour réaliser ce que vous voulez – dwonisch

Répondre

1

Si vous utilisez un socket XPUB plutôt que PUB, vous pouvez recevoir les messages d'abonnement comme vous le feriez pour les messages standard sur tout autre type de socket.

+0

Il peut être juste de noter, qu'un ** [Une réponse] * * et ** [Une proposition de solution] ** sont deux choses distinctes. ** [Une réponse] devrait être "Non, il n'y a pas de tel mécanisme ** dans les services de transport ZeroMQ pour les fonctionnalités OnSubscription(), ** mais il est possible d'ajouter un tel comportement ** comme une signalisation supplémentaire, en utilisant un transport séparé archétype ou en utilisant le même archétype "XPUB/XSUB" mais étendu qui fournit des moyens pour la signalisation basée sur le code d'un tel événement et permet au côté opposé de prendre des mesures comme "raise" ... "Cela serait à la fois vrai et juste. – user3666197

+0

@David Merci pour la réponse, j'ai vérifié et c'est effectivement le cas, je peux écouter les abonnements, les désinscriptions via XPublisherSocket. Ça ne sera toujours pas assez fiable pour moi. Mon plan est de faire un serveur qui soulève l'événement d'abonnement chaque fois que quelqu'un a commencé à s'abonner sur un abonnement et soulève l'événement de désabonnement quand plus personne n'est abonné à ce sujet. Pour cela, je vais devoir garder une trace de tous les sujets et l'identité des clients et également mettre en œuvre un mécanisme de pulsation pour suivre les clients déconnectés. – areller

+0

@David Je pense que le socket routeur est plus approprié pour ce dernier, car il connaît toutes les identités des clients hors de la boîte. De plus, je n'ai pas été en mesure d'implémenter la pulsation avec XPublisher, elle ne me permet pas de lire les messages qui ne sont pas envoyés aux abonnements. – areller