Может ли дистрибьютор NServiceBus сообщать о прогрессе от работников? - PullRequest
1 голос
/ 25 января 2011

Я изучаю NServiceBus, и я не уверен, как (или даже если) я мог бы использовать его для обработки этого сценария:

У меня есть несколько клиентов, отправляющих рабочие запросы, которые дистрибьютор передает работникам.Работа займет много времени, и я хотел бы, чтобы работники сообщали о проделанной работе клиенту, который отправил первоначальный запрос.

Я рассмотрел полнодуплексный образец, а также как добавить распределитель к этому образцу .У меня это работает, но когда я изменяю их, чтобы они отвечали серией сообщений о ходе выполнения (с задержкой между сообщениями, как показано в коде, показанном ниже), клиент получает все сообщения о ходе выполнения одновременно.

public class RequestDataMessageHandler : IHandleMessages<RequestDataMessage>
{
    public IBus Bus { get; set; }

    public void Handle(RequestDataMessage message)
    {
        for (var i = 0; i < 10; i++)
        {
            var count = i;
            var response = this.Bus.CreateInstance<DataResponseMessage>(m =>
                {
                    m.DataId = message.DataId;
                    m.Progress = count * 10;
                });

            this.Bus.Reply(response);

            Thread.Sleep(1000);
        }
    }
}

Я подозреваю, что не понял чего-то базового о том, как работает NServiceBus.Может кто-нибудь объяснить, где я ошибся, или указать на некоторые примеры и / или документацию?

Ответы [ 2 ]

2 голосов
/ 25 января 2011

То, что вы создали, всегда будет отправлять сообщения как часть одной и той же транзакции.Поскольку для каждого обработчика существует одна транзакция, вы не сможете сообщать о прогрессе таким образом.Вы должны будете иметь отдельную конечную точку для каждого блока обработки, который будет сообщать о прогрессе.Мы реализовали обмен информацией о прогрессе, обновив что-то внешнее, что не участвует в транзакции.Это можно сделать, отправив нетранзакционное сообщение другой конечной точке для обновления прогресса или что-то вроде вызова RPC.Оттуда вы можете провести опрос, который будет хранить данные о прогрессе.

1 голос
/ 25 января 2011

Пусть ваши сотрудники используют bus.Reply () для отправки сообщений вашим клиентам. Ответ автоматически отправит сообщение конечной точке, которая отправила исходное сообщение

...