NETMQ RouterSocket - правильный способ реализации длительной обработки сообщений? - PullRequest
0 голосов
/ 25 сентября 2018

Issue

У меня есть служба Windows, которая принимает запросы от .NET Web API (через RequestSocket (по одному на запрос клиента). Она будет вызывать другие внешние службы, а затем возвращать результатызапрос к клиенту.

Метод запуска службы запускает 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, который, в свою очередь, возвращает данные обратноклиент.

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 один поток, чтобы получать и отвечать клиентам.

Спасибо.

...