0

ルーター アプリケーションの初期化時に、次のコードを呼び出します。正常にバインドし、正常にメッセージを受信しますが、直接応答でない限り、On_ReceiveXXX メソッドの動作を拒否します。理由を知りたい

    public void Initialize(string frontEndAddress, string backEndAddress)
    {
        _poller = new Poller();
        _timeAllowedBetweenPings = TimeSpan.FromMinutes(1);
        _lastPingResponse = DateTime.Now;

        using (var ctx = NetMQContext.Create())
        {
            _frontEnd = ctx.CreateRouterSocket();
            _backEnd = ctx.CreateRouterSocket();

            _frontEnd.Bind(frontEndAddress);
            Console.WriteLine(string.Format("[Router]: Connected to {0}", frontEndAddress));
            _backEnd.Bind(backEndAddress);
            Console.WriteLine(string.Format("[Router]: Connected to {0}", backEndAddress));

            _frontEnd.ReceiveReady += On_ReceiveFrontEnd;
            _backEnd.ReceiveReady += On_ReceiveBackEnd;

            _poller.AddSocket(_frontEnd);
            _poller.AddSocket(_backEnd);


            var timer = new NetMQTimer(TimeSpan.FromSeconds(1));
            timer.Elapsed += On_Ping;
            _poller.AddTimer(timer);
            _poller.PollTillCancelled();
        }
    }

これは、ディーラーの ReceiveReady イベントの呼び出しに失敗します。

private void On_ReceiveFrontEnd(オブジェクト送信者, NetMQSocketEventArgs e) { _lastPingResponse = DateTime.Now; var frontEndMsg = e.Socket.ReceiveMultipartBytes(); var streamData = frontEndMsg.Last(); ApplicationMessage msg = PackageHelper.DeserializeOutgoing(streamData); Console.WriteLine(string.Format("受信したコマンド: {0}", msg.CO));

        _backEnd.SendMultipartBytes(frontEndMsg);
    }

しかし、行を変更すると

 _backEnd.SendMultipartBytes(frontEndMsg);

_frontEnd.SendMultipartBytes(frontEndMsg);

それは突然機能します...したがって、フロントエンドアプリケーションからのメッセージは応答することしかできず、バックエンドアプリケーションには渡されません。バックエンド メッセージについては、逆の場合も同様です。

4

1 に答える 1

0

ルーターを使用する場合、最初のフレームはルーティング ID であり、ソケットに固有です。したがって、メッセージ全体をルーターからルーターに渡すことはできません。バックエンドをディーラーに変更すると機能します。または、メッセージの前にバックエンド ソケットのルーティング ID を付けます。

于 2015-10-27T20:45:59.403 に答える