3

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

我认为我可以使用 JobDetails,但似乎没有反映 Job 中所做的更改?

4

2 回答 2

6

这是很有可能。

我会选择这样的东西。在职:

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 的结果。

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

于 2013-04-29T13:13:37.343 回答
2

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

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

Quartz.NET 作业是作为......井单元处理的单元,因此不知道还有多少工作要做。或者您在依赖于导入过程的另一项工作中是否需要此信息?

于 2009-08-07T09:45:13.243 回答