如何使用NServiceBus安排每天运行的任务

如何使用NServiceBus安排每天运行的任务,nservicebus,job-scheduling,Nservicebus,Job Scheduling,是否有一种使用NServiceBus安排任务的优雅方法。我找到了一种方法。NServiceBus是否提供用于调度的内部API。注意:此答案对NServiceBus 2.0版有效,但不再正确。版本3具有此功能。去读西蒙的答案,它对版本3是有效的 NServiceBus没有内置的调度系统。它(在一个非常简单的层次上)是一个消息处理器 您可以创建一个实现IWantToRunAtStartup(Run和Stop方法)的类,然后从中创建一个计时器,或者执行在特定时间将消息放到总线上所需的任何逻辑 其他人与

是否有一种使用NServiceBus安排任务的优雅方法。我找到了一种方法。NServiceBus是否提供用于调度的内部API。

注意:此答案对NServiceBus 2.0版有效,但不再正确。版本3具有此功能。去读西蒙的答案,它对版本3是有效的

NServiceBus没有内置的调度系统。它(在一个非常简单的层次上)是一个消息处理器

您可以创建一个实现IWantToRunAtStartup(Run和Stop方法)的类,然后从中创建一个计时器,或者执行在特定时间将消息放到总线上所需的任何逻辑


其他人与NServiceBus一起使用,以获得更精细的调度功能。

NServiceBus现在内置了此功能

从这里

注意警告

什么时候不用它。您可以将计划任务视为一个简单的任务 结束传奇。但一旦你的任务开始有了逻辑 (如果-/Switter语句)你应该考虑移动到一个传奇。


我们使用这种方法,效果很好。你在做什么样的处理?你可能需要一个传奇故事来代替。我正试图用同样的方法。然而,我不知道如何在调度器的实现中获得总线的引用。有趣的是,我也遇到了同样的问题。最后,我明确地向容器请求总线实例:IBus Bus=Configure.instance.Builder.Build();。如果这回答了这个问题,那么我将编辑并发布作为答案。实际上,我需要使用NServiceBus进行调度的其他想法…这只是一个分支问题。我仍在琢磨传奇的用途。:)感谢获取总线实例的技巧:)为了给您提供一些想法,我们有批处理作业(SSIS PKG),可以在特定时间将消息放到总线上。我们使用Schema Generator工具在包中创建正确的格式并发送它。在开始使用NServiceBus进行消息传递之前,我使用Quartz安排其他服务。这是我们的Quartz调度程序失效后,我第一次需要调度东西。我使用Quartz每小时触发一个作业,作业刚刚发布了一个事件。。。该服务使用了iwanttorunatstart中的Run&Stop方法。。这是一个好的开始,顺便说一句,看看西蒙,谢谢你提醒我这件事!编辑了我的答案,并对你的答案进行了升级。这对我来说很有用。。。反正有一段时间。然后有一天它在生产中失败了,调度程序停止了2天,尽管总线的其余部分继续工作。它没有记录任何NSB错误消息。所以现在我考虑改用Quartz.NET。显然这是一个已知的问题@Demonkey已修复的已知问题。但是Quartz.NET是一个非常有效的方法alternative@Simon我看到它在2014年7月被修复,我们使用的是NSB版本4.7.5,日期为2014年11月,所以我假设它包含此修复。如果修复仅在5.x分支中,那么我们仍然运气不佳,因为我们的许可证仅适用于4.x:(这是一个遗憾,因为我喜欢Schedule类的想法,并不想引用另一个包来计划每小时发送一个命令。@demoncodemonkey认为change fix被后移植到了它所在的每个次要版本中。看看它的底部,你可以看到所有相关的提交。所以,是的,你应该如果您使用的是4.7.5,我会进行修复。@demoncodemonkey顺便说一句,是什么阻止了您升级到v5?如果您想与工程师讨论此事,请随时通过simon与我联系。cropp@particular.net
public class ScheduleStartUpTasks : IWantToRunWhenTheBusStarts
{
    public void Run()
    {
        Schedule.Every(TimeSpan.FromMinutes(5)).Action(() =>
            Console.WriteLine("Another 5 minutes have elapsed."));

        Schedule.Every(TimeSpan.FromMinutes(3)).Action(
                            "MyTaskName",() =>
                            { 
                                Console.WriteLine("This will be logged under MyTaskName’.");
                            });
    }
}