NServiceBus分销商能否报告员工的进度?

NServiceBus分销商能否报告员工的进度?,nservicebus,nservicebus-distributor,Nservicebus,Nservicebus Distributor,我正在调查NServiceBus,我不确定如何(甚至是否)使用它来处理这种情况: 我有多个客户发送工作请求,分销商将这些请求分发给员工。这项工作将需要很长时间才能完成,我希望工作人员向发送原始请求的客户报告进度 我已经看过了全双工示例,也看过了。我已经让它们工作了,但是当我修改它们以回复一系列进度消息时(消息之间有一个延迟,如下面所示的代码),客户机会同时接收所有进度消息 public class RequestDataMessageHandler : IHandleMessages<Re

我正在调查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);
        }
    }
}
公共类RequestDataMessageHandler:IHandleMessages
{
公共IBus总线{get;set;}
公共无效句柄(RequestDataMessage消息)
{
对于(变量i=0;i<10;i++)
{
var计数=i;
var response=this.Bus.CreateInstance(m=>
{
m、 DataId=message.DataId;
m、 进度=计数*10;
});
本.总线.应答(应答);
睡眠(1000);
}
}
}

我想我还不了解NServiceBus的基本工作原理。有人能解释一下我哪里出错了,或者给我举一些例子和/或文档吗?

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

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

我使用的是Bus.Reply()-我在原始问题中添加了一个代码示例。问题是,所有答复都同时到达客户端(当服务器完成Handle()方法时),而不是间隔。上面的Adams回答解释了为什么会发生这种情况。我同意他建议的将流程分成不同块的方法(可能通过使用bus.SendLocal)。另一个“黑客”选项是用一个新的TransactionScope(ScopeOptions.superss)包装那些总线.Reply。这将导致立即发送回复。您的“黑客”方法可行,但我在现阶段还不了解其缺点。谢谢,这非常有用。我想我需要仔细阅读事务性和非事务性消息。nservicebus网站上的文档似乎有点少——你对在哪里找到好的材料有什么建议吗?另一个好地方是雅虎集团。这里有类似的活动,但在这一点上有更多的活动。