Quartz.Net工作进展

时间:2009-08-07 09:19:13

标签: c# quartz-scheduler

IJob是否有一种简单的方法可以在Job中发布数据。我有一个Job正在运行一个导入过程,但是想通过查找Job并请求它来检索进度。

我认为我可以使用JobDetails,但似乎没有反映出Job中的变化?

2 个答案:

答案 0 :(得分:3)

很有可能。

我会选择这样的东西。 在工作中:

public virtual void Execute(IJobExecutionContext context)
{
    int i = 0;
    while (i++ < 100)
    {
        context.JobDetail.JobDataMap["progress"] = i;
        Thread.Sleep(1000);
    }
}

在想要检索进度的代码中:

var jobs = scheduler.GetCurrentlyExecutingJobs();
foreach (var j in jobs)
{
    Console.WriteLine("Progress of {0} is {1}", 
        j.JobDetail.Key, 
        j.JobDetail.JobDataMap["progress"]);
}

您当然可以过滤GetCurrentlyExecutingJobs的结果。

此外,您可以将作业设置为DurablePersistJobDataAfterExecution,因此在完成后,您可以通过scheduler.GetJobDetail(..)检索其进度和其他任何内容并访问其JobDataMap之后。

答案 1 :(得分:2)

没有一种内置的方式可以让您轻松找到您想要的东西。但是通过发布订阅将进度信息发布到其他设施并不困难。您还可以定期将进度信息写入持久存储 - 当您知道已处理的最后一个成功位时,这也可以让您轻松重试。

如果外部线程/进程轮询了您要导入的目标,那么外部线程/进程也可以确定状态,并且您将获得有关将要导入的总项目的信息。

Quartz.NET作业是作为..井单元处理的单元,因此没有关于还有多少工作要做的概念。或者您是否需要在依赖导入过程的其他工作中使用此信息?