Nservicebus:在Schedule.Every操作中发送消息

时间:2015-01-21 13:22:55

标签: c# nservicebus schedule

我正在使用从官方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)。也可能是给定队列尚未创建或已被删除。

任何帮助都会很棒!

1 个答案:

答案 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

最后一行启动总线并要求启动代码运行委托,强制安装程序运行。