我需要使用Orchard CMS创建计划任务。
我有一个服务方法(假设它从外部源加载一些数据),我需要每天早上8点执行它。
我想我必须使用IScheduledTaskHandler和IScheduledTaskManager ......有谁知道如何解决这个问题?一些示例代码将被评估。
答案 0 :(得分: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);
}
}
}
答案 1 :(得分:2)
您应该使用@Entity
@Table(name = "system_configuration_metadata")
public class SysConfigMetaDataDTO {
@Id
@Column(name = "id")
private Long id;
@Column(name = "system_configuration_id")
private Long systemConfigurationId;
}
的实现进行第一次调度,而不是在任务构造函数中进行调度,以避免添加多个任务。
这里是一个抽象的address=/example.com/0.0.0.0
类,您可以实现:
用法
public class NeutralFactory: NPCFactory
{
private List<Func<int, Creature>> humanoids = new List<Func<int, Creature>> {
hp=> new Dwarf(hp),
hp=> new Fairy(hp),
hp=> new Elf(hp),
hp=> new Troll(hp),
hp=> new Orc(hp)
};
private Random random = new Random();
public Creature CreateHumanoid(int hp = 100)
{
int index = random.Next(humanoids.Count);
return humanoids[index](hp);
}
}
抽象的日常任务处理程序和调度程序
IOrchardShellEvents
通过在任务处理程序类上使用schedule方法和DailyTaskHandler
实现,可以避免使用任务计划程序类。