使用Orchard CMS的计划任务

Dev*_*Dav 3 model-view-controller orchardcms

我需要使用Orchard CMS创建计划任务.

我有一个服务方法(假设它从外部源加载一些数据),我需要每天上午8:00执行它.

我想我必须使用IScheduledTaskHandler和IScheduledTaskManager ...有谁知道如何解决这个问题?一些示例代码将被评估.

Eil*_*aee 11

在您的IScheduledTaskHandler中,您必须实现Process来提供您的任务实现(我建议您将您的实现放在另一个服务类中),并且您必须在任务管理器中注册您的任务.一旦在Handler构造函数中注册第一个任务,然后在流程实现中,确保一旦执行任务,就会安排下一个任务.

这是一个示例:

public class MyTaskHandler : IScheduledTaskHandler
{
  private const string TaskType = "MyTaskUniqueID";
  private readonly IScheduledTaskManager _taskManager;

  public ILogger Logger { get; set; }

  public MyTaskHandler(IScheduledTaskManager taskManager)
  {
    _taskManager = taskManager;
    Logger = NullLogger.Instance;
    try
    {
      DateTime firstDate = //Set your first task date (utc).
      ScheduleNextTask(firstDate);
    }
    catch(Exception e)
    {
       this.Logger.Error(e,e.Message);
    }
  }

  public void Process(ScheduledTaskContext context)
  {
     if (context.Task.TaskType == TaskType)
     {
       try
       {
               //Do work (calling an IService for instance)
       }
       catch (Exception e)
       {
         this.Logger.Error(e, e.Message);
       }
       finally
       {
         DateTime nextTaskDate = //Your next date (utc).
         this.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);
      }
  }


}
Run Code Online (Sandbox Code Playgroud)