如何向 NetMQ 上的特定 Worker 发送消息?

时间:2021-03-26 14:47:57

标签: c# .net zeromq netmq

我在 C# 上使用 ZeroMQ 向特定工作人员发送消息时遇到问题。

应用架构如下:

Architecture of the application

例如,我想从“client1”向“worker2”发送一条消息。 但是我的应用程序发送到“worker1”然后发送到“worker2”以进行下一步。

连接到经销商的我的工人代码:

public static void RRWorker(string[] args)
{
    if (args == null || args.Length < 2)
    {

        if (args != null)
        {
            if (args.Length < 1)
            {
                args = new string[] { "World", "tcp://127.0.0.1:5560" };
            }
            else
            {
                args = new string[] { args[0], "tcp://127.0.0.1:5560" };
            }
        }
        else
        {
            args = new string[] { "World", "tcp://127.0.0.1:5560" };
        }
        
    }

    string name = args[0];

    string endpoint = args[1];

    // Socket to talk to clients
    using (var context = new ZContext())
    using (var responder = new ZSocket(context, ZSocketType.REP))
    {
        responder.IdentityString = name;
        responder.Connect(endpoint);
        Console.WriteLine("Ready : " + name);

        while (true)
        {
            // Wait for next request from client
            using (ZMessage request = responder.ReceiveMessage())
            {                       
                Console.WriteLine("W "+name +" .Message count : " + request.Count);
                for (int i =0; i< request.Count; i++)
                {
                    Console.WriteLine("--W--" + request[i]);
                }
                // Send reply back to client
                Console.WriteLine("Worker Name : {0}... ", name);
                responder.Send(new ZFrame(name));
            }
        }
    }
}

我的客户代码:

 public static void RRClient(string name)
{
    // Socket to talk to router
    using (var context = new ZContext())
    using (var requester = new ZSocket(context, ZSocketType.REQ))
    {
        requester.IdentityString = name;
        //requester.Identity = Encoding.Unicode.GetBytes(name);
        requester.Connect("tcp://127.0.0.1:5559");
        ZFrame messageContent;
        ZFrame destination;

        var outgoing = new ZMessage();
        destination = new ZFrame("Worker2");
        messageContent = new ZFrame("test Message");
        
        outgoing.Append(destination);
        outgoing.Append(new ZFrame());
        outgoing.Append(messageContent);

        requester.Send(outgoing);
        using (ZFrame reply = requester.ReceiveFrame())
            {
                Console.WriteLine("Client request : Hello {0}!", reply.ReadString());
            }
    }
}

我的经纪人(路由器/经销商)代码:

public static void RRBroker(string[] args)
{
    // Prepare our context and sockets
    using (var ctx = new ZContext())
    using (var frontend = new ZSocket(ctx, ZSocketType.ROUTER))
    using (var backend = new ZSocket(ctx, ZSocketType.DEALER))
    {
        frontend.Bind("tcp://*:5559");
        backend.Bind("tcp://*:5560");

        // Initialize poll set
        var poll = ZPollItem.CreateReceiver();

        // Switch messages between sockets
        ZError error;
        ZMessage message;
        ZMessage messageTosend;
        while (true)
        {
            if (frontend.PollIn(poll, out message, out error, TimeSpan.FromMilliseconds(64)))
            {                       
                for (int i = 0; i < message.Count; i++)
                {
                    Console.WriteLine("--F--" + message[i].ReadString());
                }
                Console.WriteLine("-----" + GloFunction.ZMessageToString(message) + "---");
                backend.Send(message);
            }
            else
            {
                if (error == ZError.ETERM)
                    return; // Interrupted
                if (error != ZError.EAGAIN)
                    throw new ZException(error);
            }

            if (backend.PollIn(poll, out message, out error, TimeSpan.FromMilliseconds(64)))
            {
                Console.WriteLine("B Message count : " + message.Count);
                for (int i = 0; i < message.Count; i++)
                {
                    Console.WriteLine("--B--" + message[i].ToString());
                }                       
                GloFunction.Console_WriteZMessage("backend", 2, message);
                
                frontend.Send(message);
            }
            else
            {
                if (error == ZError.ETERM)
                    return; // Interrupted
                if (error != ZError.EAGAIN)
                    throw new ZException(error);
            }
        }
    }
}

为了运行我的应用程序,我在特定线程中创建了我的所有设备(路由器、经销商、client1、client2、worker1、worker2)。

运行“client1”两次的示例:

Ready : Worker2
Ready : Worker1

--F--Client1
--F--
--F--Worker2
--F--
--F--test Message
-----Client1Worker2test Message---
W Worker2 .Message count : 3
--W--Worker2
--W--
--W--test Message
Worker Name : Worker2... 
B Message count : 3
--B--Client1
--B--
--B--Worker2
backend: Worker2
Client request : Hello Worker2!
Le thread 0x3d74 s'est arrêté avec le code 0 (0x0).

--F--Client1
--F--
--F--Worker2
--F--
--F--test Message
-----Client1Worker2test Message---
W Worker1 .Message count : 3
--W--Worker2
--W--
--W--test Message
Worker Name : Worker1... 
B Message count : 3
--B--Client1
--B--
--B--Worker1
backend: Worker1
Client request : Hello Worker1!
Le thread 0x4fd4 s'est arrêté avec le code 0 (0x0).

我做错了什么?

0 个答案:

没有答案