IJob 是否有一种简单的方法可以从 Job 中发布数据。我有一个运行导入过程的作业,但想通过查找作业并请求它来检索进度。
我认为我可以使用 JobDetails,但似乎没有反映 Job 中所做的更改?
IJob 是否有一种简单的方法可以从 Job 中发布数据。我有一个运行导入过程的作业,但想通过查找作业并请求它来检索进度。
我认为我可以使用 JobDetails,但似乎没有反映 Job 中所做的更改?
这是很有可能。
我会选择这样的东西。在职:
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 的结果。
此外,您可以将作业设置为Durable
and PersistJobDataAfterExecution
,因此在完成后,您可以检索其进度和其他任何内容,scheduler.GetJobDetail(..)
并在之后访问它JobDataMap
。
没有一种内置方式可以轻松地为您提供您正在寻找的东西。但是通过发布订阅将进度信息发布到其他设施并不难。您还可以定期将进度信息写入持久性存储 - 当您知道已处理的最后一个成功位时,这也将为您提供轻松重试的好处。
如果外部线程/进程轮询您正在导入的目标,并且您将在某处获得有关将要导入的总项目的信息,那么它也可以确定状态。
Quartz.NET 作业是作为......井单元处理的单元,因此不知道还有多少工作要做。或者您在依赖于导入过程的另一项工作中是否需要此信息?