在 Quartz.net 安排一个动作
Schedule an Action in Quartz.net
我正在尝试了解 Quartz.NET 的来龙去脉,但在完成我认为非常简单的任务方面并没有取得太大进展。
我有一个接收 Action 和 DateTime 的方法,我只需要在时间 Y 将操作 X 安排到 运行。
这看起来很简单,但是 JobBuilder.Create() 需要一个实现 IJob 的类型参数...但是在我得到它之前,我一点也不知道我收到的 Action 做了什么。我无法使用定义明确的 Execute(IJobExecutionContext context) 方法 class,因为我在编译时没有该信息。
我也无法更改方法的签名。我得到一个 Action 和一个 DateTime,这不是我的决定。
Quartz真的不能处理这个看似简单的任务吗?
我不知道 Quartz.Net 是否是实现您正在寻找的目标的正确工具。
用它来做会很复杂。
我建议您切换到另一个工具,例如 FluentScheduler:
Install-Package FluentScheduler
然后你可以这样做:
class Program
{
static void Main(string[] args)
{
ScheduleAction(DateTime.UtcNow.AddSeconds(4), Action1, "A", "B");
ScheduleAction(DateTime.UtcNow.AddSeconds(8), Action1, "C", "D");
ScheduleAction(DateTime.UtcNow.AddSeconds(12), Action1, "E", "F");
Console.WriteLine("Running ...");
Console.ReadLine();
}
private static void ScheduleAction(DateTime runOnceAt, Action<string, string> action, string param1, string param2)
{
FluentScheduler.TaskManager.AddTask(() =>
{
action.Invoke(param1, param2);
}, x => x.WithName("MyTask").ToRunOnceAt(runOnceAt));
}
private static void Action1(string param1, string param2)
{
Console.WriteLine("Running Action 1 {0} - {1}", param1, param2);
}
private static void Action2(string param1, string param2)
{
Console.WriteLine("Running Action 2 {0} - {1}", param1, param2);
}
private static void Action3(string param1, string param2)
{
Console.WriteLine("Running Action 3 {0} - {1}", param1, param2);
}
}
我不认为 Quartz 内置了这种特殊的能力,但是在 Quartz 现有的 API 之上实现它是微不足道的:
class RunActionJob : IJob
{
public void Execute(IJobExecutionContext context)
{
var action = context.MergedJobDataMap["action"] as Action;
action();
}
}
public static JobBuilder ActionJob(Action action)
{
return JobBuilder
.Create<RunActionJob>()
.SetJobData(new JobDataMap
{
{"action", action}
});
}
// Usage:
var job = ActionJob(() => Console.WriteLine("task 1..."))
.WithIdentity("task1", "group1")
.Build();
我正在尝试了解 Quartz.NET 的来龙去脉,但在完成我认为非常简单的任务方面并没有取得太大进展。
我有一个接收 Action 和 DateTime 的方法,我只需要在时间 Y 将操作 X 安排到 运行。
这看起来很简单,但是 JobBuilder.Create() 需要一个实现 IJob 的类型参数...但是在我得到它之前,我一点也不知道我收到的 Action 做了什么。我无法使用定义明确的 Execute(IJobExecutionContext context) 方法 class,因为我在编译时没有该信息。
我也无法更改方法的签名。我得到一个 Action 和一个 DateTime,这不是我的决定。
Quartz真的不能处理这个看似简单的任务吗?
我不知道 Quartz.Net 是否是实现您正在寻找的目标的正确工具。
用它来做会很复杂。
我建议您切换到另一个工具,例如 FluentScheduler:
Install-Package FluentScheduler
然后你可以这样做:
class Program
{
static void Main(string[] args)
{
ScheduleAction(DateTime.UtcNow.AddSeconds(4), Action1, "A", "B");
ScheduleAction(DateTime.UtcNow.AddSeconds(8), Action1, "C", "D");
ScheduleAction(DateTime.UtcNow.AddSeconds(12), Action1, "E", "F");
Console.WriteLine("Running ...");
Console.ReadLine();
}
private static void ScheduleAction(DateTime runOnceAt, Action<string, string> action, string param1, string param2)
{
FluentScheduler.TaskManager.AddTask(() =>
{
action.Invoke(param1, param2);
}, x => x.WithName("MyTask").ToRunOnceAt(runOnceAt));
}
private static void Action1(string param1, string param2)
{
Console.WriteLine("Running Action 1 {0} - {1}", param1, param2);
}
private static void Action2(string param1, string param2)
{
Console.WriteLine("Running Action 2 {0} - {1}", param1, param2);
}
private static void Action3(string param1, string param2)
{
Console.WriteLine("Running Action 3 {0} - {1}", param1, param2);
}
}
我不认为 Quartz 内置了这种特殊的能力,但是在 Quartz 现有的 API 之上实现它是微不足道的:
class RunActionJob : IJob
{
public void Execute(IJobExecutionContext context)
{
var action = context.MergedJobDataMap["action"] as Action;
action();
}
}
public static JobBuilder ActionJob(Action action)
{
return JobBuilder
.Create<RunActionJob>()
.SetJobData(new JobDataMap
{
{"action", action}
});
}
// Usage:
var job = ActionJob(() => Console.WriteLine("task 1..."))
.WithIdentity("task1", "group1")
.Build();