2017-06-23 7 views
0

2つのシンプルなC#コンソールプロジェクト(.net 4.5.2)を作成し、それぞれにv4.0.0.1 NetMQ Nugetパッケージを追加し、 Visual Studio 2017 Community Editionでは、OnReceiveReadyコールバックメソッドに含まれる1行にブレークポイントを設定し、最初にサブスクライバプログラムを起動し、次にパブリッシャプログラムを開始しました。 ReceiveReadyイベントがサブスクライバでトリガされていません。私は間違って何をしていますか?私がsubSocket.Subscribe( "")を選択したとしても、受信したメッセージはまだ得られませんでした。また、Send/Receive HighWatermarksを削除/変更しても変更されませんでした。ご協力いただきありがとうございます!ReadyReceive pub-subをNetMQ 4.xを使用して動作させることができません

はここで出版社コードです:

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); 
      } 
     } 
    } 
} 

ここでは加入者コードは次のとおりです。

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(); 
     } 
    } 
} 

答えて

0

[OK]を、これはNetMQの世界で落とし穴の問題であり、私はそれを考え出しました。追加したすべてのReceiveReadyコールバックを呼び出すNetMQPollerをセットアップする必要があります(NetMQPoller)。ここで

は、少なくともます修正されたコードである(すなわち、ReceiveFrameStringはまだ唯一の「NQ」の部分を取得するが、それは修正するだけで、別のメソッド呼び出しの)ReceiveReadyイベントを取得するトリガー:

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() 
     } 
    } 
} 

私は気づいNetMQの著者は、Contextオブジェクトを内部的に世話するように4.xで決定しました。そのため、ユーザーはそれを管理する負担を負う必要はありませんでした。最も単純なユースケースの場合にも、この「ポーリングポンプ」コードをユーザーから隠すことができれば、いいでしょう。

私が上に掲示したパブリッシャーコンソールアプリを利用して、NodeJS(zmqライブラリーを使用)を使用してサブスクライバーを見てください(このコードをsub.jsに保存し、Windowsコンソールに '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); 
}); 

ここでポーラーポンプ機構はどこですか? NetMQPollerは汎用性があり、より複雑な問題を処理することができますが、基本的な "それが到着したときにコールバックでメッセージを出してください。 "、それがライブラリによって内部的に処理されていればいいでしょう。])

関連する問題