我在弄清楚如何使用分销商正确执行以下操作时遇到了一些麻烦:
- 创建一个发送命令的服务(分发器),这些命令分布在工作人员之间。如果我使用 IWantToRunAtStartup 实现启动 Distributor,我可以实现这种行为。见下文。
- 创建一个处理这些命令的服务(worker)。然后,我将启动 X 个实例来扩展该工作人员。
- 到目前为止,这一切都在同一台机器上。
NSB 中包含的示例有点难以理解,或者可能只是我个人 :)。
例如,我有一个分销商和一个工人:
经销商:
class MessageCreator: IWantToRunAtStartup
{
public IBus Bus { get; set; }
public void Run()
{
Thread.Sleep(5000); //Allow workers to checkin
for (int i = 0; i < 1000; i++ )
{
Bus.Send(new DoWorkForCustomerCommand { CustomerID = i });
}
}
public void Stop() { }
}
...
public class EndpointConfig : IConfigureThisEndpoint, AsA_Server
{
public void Init()
{
Configure.Instance.RunDistributor();
}
}
应用程序配置
<configSections>
<section name="Logging" type="NServiceBus.Config.Logging, NServiceBus.Core" />
<section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
<section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" />
</configSections>
<MessageForwardingInCaseOfFaultConfig ErrorQueue="error"/>
<Logging Threshold="INFO" />
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="Messages" Endpoint="Worker" />
</MessageEndpointMappings>
</UnicastBusConfig>
工人:
public class MessageHandler: IHandleMessages<DoWorkForCustomerCommand >
{
public void Handle(DoWorkForCustomerCommand message)
{
Console.WriteLine("Handled customer with Id: " + message.CustomerID );
}
}
...
public class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher
{
public void Init()
{
Configure.Instance.EnlistWithDistributor();
// For some reason this: Configure.Instance.RunDistributor(); achieves the same thing.
}
}
应用程序配置
<configSections>
<section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" />
</configSections>
<MessageForwardingInCaseOfFaultConfig ErrorQueue="error" />
这适用于我的机器,并且可以很好地分配给我开始的任何数量的工人,但我没有错过什么吗,ScaleOut 示例似乎更复杂?
为什么我可以将工人作为分销商开始,然后看到工人表现得好像是工人,而实际上是作为分销商开始的?
如果我只是在工作程序 app.config 中添加队列名称/端点,这不会跨机器工作吗?