如何在Orchard中运行预定任务?

我必须每5个小时运行一次自动化工作。

我发现了这篇关于如何使用IScheduledTaskHandler和IScheduledTaskManager创建计划任务的post。 使用Orchard CMS的计划任务

我复制了相同的代码,我在Process函数中添加了我的服务调用。 它汇编很好。 但我不确定是否必须“启动”此计划任务,如Windows服务启动。 在我构建解决方案后它是否会自动获取? 如果我想在5个小时内完成这项工作,时钟何时开始计时? 如果我想停止/暂停,我该怎么做?

谢谢。

编辑:

如果我尝试使用任务处理程序启用自定义模块,我会收到exception。

exception详细信息:System.ArgumentNullException:值不能为null。 参数名称:source

Line 241: var shellContext = _shellContexts.FirstOrDefault(c => c.Settings.Name == settings.Name); 

源文件:\ orchard-1.4 \ src \ Orchard \ Environment \ DefaultOrchardHost.cs行:241

_shellContexts即将出现。 如果我从项目/模块中删除任务处理程序类,一切正常。

这是任务处理程序代码。

 public class ScheduledTaskHandler : IScheduledTaskHandler { private const string TaskType = "MyTaskUniqueID"; private readonly IScheduledTaskManager _taskManager; private readonly IMyService _myService; public ILogger Logger { get; set; } public ScheduledTaskHandler(IScheduledTaskManager taskManager, IMyService myService) { _myService = myService; _taskManager = taskManager; Logger = NullLogger.Instance; try { DateTime firstDate = new DateTime().AddMinutes(5); ScheduleNextTask(firstDate); } catch (Exception e) { this.Logger.Error(e, e.Message); } } public void Process(ScheduledTaskContext context) { if (context.Task.TaskType == TaskType) { try { _myService.RunJob(); } catch (Exception e) { this.Logger.Error(e, e.Message); } finally { DateTime nextTaskDate = new DateTime().AddHours(5); ScheduleNextTask(nextTaskDate); } } } private void ScheduleNextTask(DateTime date) { if (date > DateTime.UtcNow) { var tasks = this._taskManager.GetTasks(TaskType); if (tasks == null || tasks.Count() == 0) this._taskManager.CreateTask(TaskType, date, null); } } } 

启动应用程序时,时钟会自动开始计时 – 您无法停止/暂停它。

调度程序每隔1分钟运行一次 – 它会检查是否有应该立即运行的任务并运行它们。 任务存储在数据库中 – 相应的记录总是在任务执行即将开始之前被删除(以确保给定的任务只运行一次)。

如果您需要运行一个循环作业,则需要在上一个任务完成后创建一个新任务(如您链接到的示例中)。

如果有人感兴趣我只是从ScheduledTaskHandler中删除了入门代码。 下面我介绍了一些控制器构造函数

 private void ScheduleStartTask() { var tasks = _scheduledTaskManager.GetTasks(TaskType); if (tasks == null || tasks.Count() == 0) { var date = _clock.UtcNow.AddSeconds(5); _scheduledTaskManager.CreateTask(TaskType, date, null); } } 

并在处理程序上

 public void Process(ScheduledTaskContext context) { if (context.Task.TaskType == TaskType) { try { var x = "kuku"; } catch (Exception e) { this.Logger.Error(e, e.Message); } finally { this.ScheduleNextTask(); } } } private void ScheduleNextTask() { var date = _clock.UtcNow.AddSeconds(5); _taskManager.DeleteTasks(null, a => a.TaskType == TaskType); _taskManager.CreateTask(TaskType, date, null); } 

使用ILoggerFactory而不是ILogger,然后从中获取Logger实例。

 public ScheduledTaskHandler(IScheduledTaskManager taskManager,ILoggerFactory LoggerFactory, IMyService myService) { _myService = myService; _taskManager = taskManager; Logger = NLoggerFactory.CreateLogger(typeof(ScheduledTaskHandler));; try { DateTime firstDate = new DateTime().AddMinutes(5); ScheduleNextTask(firstDate); } catch (Exception e) { this.Logger.Error(e, e.Message); } }