NETMQ RouterSocket-实施长时间运行的消息处理的正确方法吗?

时间:2018-09-25 20:28:49

标签: netmq

问题

我有一个Windows服务,该服务接受来自.NET Web API的请求(通过RequestSocket(每个客户请求一个)。它将退出其他外部服务,然后将请求的结果返回给客户端。 / p>

该服务的Start方法在其自己的线程上启动RouterSocket。

    public void Start()
    {
        System.Threading.Tasks.Task.Run(() => NetMqServer.GetInstance().StartServer());
    }

问题1 :可以在自己的线程上启动NETMQ吗?

NetMqServer是单例类。在StartServer方法中,我们从这里开始侦听来自客户端的请求。

public class NetMqServer : IDisposable
{
    private RouterSocket _socket;

    ...

    public void StartServer()
    {
        _socket = new RouterSocket();
        _socket.Bind(_netmqConnStr);

        while (_listening)
        {
            var msg = _socket.ReceiveMultipartMessage();

            var identity = msg.Pop().ConvertToString();
            var x = msg.Pop().ConvertToString(); // empty frame
            var data = msg.Pop().ConvertToString();

            // This is a **fire and forget** method
            ProcessMessage.Process(identity, data);
        }
    }

    public async Task SendMessageToClient(string id, int errorCode, string response)
    {
            NetMQMessage message = new NetMQMessage();
            message.Append(System.Text.Encoding.ASCII.GetBytes(id));
            message.AppendEmptyFrame();
            message.Append(errorCode);
            message.Append(response);

            _socket.SendMultipartMessage(message);
    }
}

问题2:我需要在while循环内进行尝试吗?

当Process方法完成工作时,它将在NetMQServer上调用一个方法以将结果发送回WebAPI,然后WebAPI将数据返回给客户。

public class ProcessMessage
{
    private RouterSocket _socket;

    public async Task Process(string identity, string data)
    {
        // Call off to external services
        // awaiting the external calls

        ProcessResponse(result, identiy);
    }

    private void ProcessResponse(string message, string identity)
    {
        // Removed extra logic

        // Notice no await... I want to fire and forget.
        NetMqServer.GetInstance().SendMessageToClient(identity, 0, message);
    }
}

问题3:这是将消息发送回客户端的正确方法吗? SendMessage是异步的,它将在其自己的线程中运行。我一直在阅读,我应该使用RouterSocket一个线程来检索和响应客户端。

谢谢。

0 个答案:

没有答案