我正在使用从官方NserviceBus Walk through创建的代码,我正在尝试使用“计划”操作发送消息
public class SendOrder : IWantToRunWhenBusStartsAndStops
{
public IBus Bus { get; set; }
public Schedule _schedule;
public SendOrder(Schedule schedule)
{
_schedule = schedule;
}
public void Start()
{
_schedule.Every(TimeSpan.FromSeconds(5),() =>
{
Bus.Send("Ordering.Server", new PlaceOrder {Id = Guid.NewGuid()});
Console.WriteLine("Sent a message.");
});
}
public void Stop()
{
}
}
但是我收到一个错误,我不明白它为什么会调用Timeouts队列。当调用不在“计划”操作中的Bus.Send时,它可以正常工作。
找不到目标队列'Ordering.Client.Timeouts@Z220-STATION1'。您可能在配置文件的UnicastBusConfig部分的MessageEndpointMappings中错误配置了此类消息的目标(NServiceBus.Scheduling.Messages.ScheduledTask,NServiceBus.Core,Version = 5.0.0.0,Culture = neutral,PublicKeyToken = 9fc386479f8a226c)。也可能是给定队列尚未创建或已被删除。
任何帮助都会很棒!
答案 0 :(得分:0)
要回答您的问题 - NServiceBus调度通过向未来发送超时消息来工作。当超时消息到达时,它会调用您的委托并发送另一个超时。
这就是你必须有一个超时队列的原因。
NServiceBus在开发配置文件中执行时自动创建队列。这在生产中不会发生。如果你使用NServiceBus托管,你应该运行nservicebus.host.exe / install,或者如果你运行自托管,你应该在你的代码中初始化安装程序:
Bus = Configure.With()
.Log4Net()
.DefaultBuilder()
.XmlSerializer()
.MsmqTransport()
.IsTransactional(false)
.PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(false)
.CreateBus()
.Start(() => Configure.Instance.ForInstallationOn<Windows>().Install());
如上所述here
最后一行启动总线并要求启动代码运行委托,强制安装程序运行。