2012-01-18 2 views
3

Orchard CMS를 사용하여 예약 된 작업을 만들어야합니다.Orchard CMS를 사용하여 예약 된 작업

저는 서비스 메소드를 가지고 있습니다. (외부 소스로부터 데이터를로드한다고 가정 해 봅시다.) 매일 8:00 AM에 실행해야합니다.

나는 IScheduledTaskHandler와 IScheduledTaskManager를 사용해야한다는 것을 알아 냈습니다 ... 누군가이 문제를 해결하는 방법을 알고 있습니까? 몇 가지 샘플 코드가 appriciated됩니다.

답변

11

IScheduledTaskHandler에서 작업 구현을 제공하려면 프로세스를 구현해야합니다 (구현을 다른 서비스 클래스에 넣으라고 조언합니다). 작업 관리자에 작업을 등록해야합니다. 첫 번째 작업을 등록한 후 처리 구현에서 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); 
     } 
    } 


} 
+0

이 작동하지만, 여러 작업을 추가합니다. 프로세스를 시작하는 다른 방법이 있습니까? – Carl

+0

@Carl 아래 답변을 참조하십시오! – Brendan

+1

이것은 정확히 내가 필요로했던 것입니다. 감사. – bingles