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