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

时间:2012-07-13 17:12:17

标签: c# asp.net .net timer orchardcms

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

我发现这篇文章是关于如何使用IScheduledTaskHandler和IScheduledTaskManager创建计划任务的。 Scheduled tasks using Orchard CMS

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

感谢。

编辑:

如果我尝试使用任务处理程序启用自定义模块,则会出现异常。

异常详细信息: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);
        }
    }


}

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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);
    }

答案 2 :(得分:0)

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

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);
        }
    }