我必须每5个小时运行一次自动化作业。
我发现这篇文章是关于如何使用IScheduledTaskHandler和IScheduledTaskManager创建计划任务的。 Scheduled tasks using Orchard CMS
我复制了相同的代码,我在Process函数中添加了我的服务调用。它汇编得很好。但我不确定是否必须“启动”此计划任务,如Windows服务启动。在我构建解决方案后它会自动获取吗?如果我想在5个小时内完成这项工作,时钟何时开始计时?如果我想停止/暂停,我该怎么做?
感谢。
编辑:
如果我尝试使用任务处理程序启用自定义模块,则会出现异常。
异常详细信息: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);
}
}
}
答案 0 :(得分:4)
启动应用程序时,时钟会自动开始滴答 - 您无法停止/暂停它。
调度程序每隔1分钟运行一次 - 它会检查是否有应该立即运行的任务并运行它们。任务存储在数据库中 - 相应的记录总是在任务执行即将开始之前被删除(以确保给定的任务只运行一次)。
如果您需要运行一个周期性作业,则需要在上一个任务完成后创建一个新任务(如您链接到的示例中)。
答案 1 :(得分:1)
如果有人感兴趣,我只是从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);
}
答案 2 :(得分:0)
使用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);
}
}