如何运行在果园计划任务?(How to run scheduled tasks in Orchard

2019-06-26 06:55发布

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

我发现了如何创建计划任务,使用IScheduledTaskHandler和IScheduledTaskManager这个职位。 利用果园CMS计划任务

我复制了相同的代码,我加入了过程的功能在我的服务电话。 它编译罚款。 但我不知道我是否有“启动”此计划的任务,就像一个窗口服务的开始。 是否得到自动拾取后我构建解决方案? 什么时候时钟开始计时,如果我想在运行5小时这份工作? 如果我想停止/暂停,我该怎么办呢?

谢谢。

编辑:

如果我尝试启用与任务处理程序中的自定义模块我得到一个例外。

异常详细信息:System.ArgumentNullException:值不能为空。 参数名:源

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

源文件:\果园1.4的\ src \果园\环境\ 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);
        }
    }


}

Answer 1:

时钟开始当你启动应用程序自动滴答作响 - 你不能停止/暂停。

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

如果你需要经常性的工作,跑出,你需要创建前一个已完成刚过一个新的任务(比如上例中您链接到)。



Answer 2:

如果有人有兴趣,我只是删除从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);
    }


Answer 3:

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


文章来源: How to run scheduled tasks in Orchard?