1

我正在调查 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 的工作原理还不太了解。有人可以解释我哪里出错了,或者指出一些例子和/或文档吗?

4

2 回答 2

2

您构建的内容将始终将消息作为同一事务的一部分发送。由于每个处理程序有一个事务,因此您将无法以这种方式传达进度。您必须为每个可以传达进度的处理块有一个单独的端点。我们通过更新事务中不涉及的外部内容来实现通信进度。这可以通过向另一个端点发送非事务性消息来更新进度或类似 RPC 调用的方式来完成。从那里您可以对进度数据存储进行轮询。

于 2011-01-25T20:47:16.980 回答
1

让您的员工使用 bus.Reply() 将消息发送回您的客户。回复将自动将消息发送到发送原始消息的端点

于 2011-01-25T17:10:03.423 回答