我需要每隔5小时运行一次自动化任务。我在这篇文章中发现了如何创建定时任务,使用IScheduledTaskHandler和IScheduledTaskManager。
Scheduled tasks using Orchard CMS
我复制了相同的代码,在Process函数中添加了我的服务调用。它编译得很好。但是我不确定我是否必须像启动Windows服务那样“启动”此计划任务。如果我想要在5小时内运行此作业,它会自动被捕获吗?如果我想要停止/暂停,我该怎么做?
谢谢。
编辑:
如果我尝试启用具有任务处理程序的自定义模块,则会出现异常。
异常详细信息:System.ArgumentNullException:值不能为 null。 参数名:source
谢谢。
编辑:
如果我尝试启用具有任务处理程序的自定义模块,则会出现异常。
异常详细信息: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);
}
}
}
_shellContexts
由于某种原因为null。你能展示一下你的任务处理器代码吗?顺便说一下 - 检查一下任务处理器应该如何编写,例如在Orchard.PublishLater模块中。也许你做错了什么。但在看到整个情况之前无法确定任何事情。 - Piotr SzmydMyServices
构造函数中执行某些可能会引发空引用异常的操作?不要在那里放置任何复杂逻辑,或者确保你进行必要的检查。 - Piotr Szmyd