Jan*_*ger 3 c# quartz-scheduler
IJob 是否有一种简单的方法可以从 Job 中发布数据。我有一个运行导入过程的作业,但想通过查找作业并请求它来检索进度。
我以为我可以使用 JobDetails,但似乎没有反映在 Job 中所做的更改?
这是很有可能。
我会用这样的东西。在职:
public virtual void Execute(IJobExecutionContext context)
{
int i = 0;
while (i++ < 100)
{
context.JobDetail.JobDataMap["progress"] = i;
Thread.Sleep(1000);
}
}
Run Code Online (Sandbox Code Playgroud)
在想要检索进度的代码中:
var jobs = scheduler.GetCurrentlyExecutingJobs();
foreach (var j in jobs)
{
Console.WriteLine("Progress of {0} is {1}",
j.JobDetail.Key,
j.JobDetail.JobDataMap["progress"]);
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以过滤 GetCurrentlyExecutingJobs 的结果。
此外,您可以将作业设置为Durableand PersistJobDataAfterExecution,因此在完成后,您可以检索其进度和其他任何内容,scheduler.GetJobDetail(..)并在JobDataMap之后访问它。
没有一种内置方法可以轻松地为您提供您正在寻找的东西。但通过发布订阅向其他设施发布进度信息也不是那么困难。您还可以定期将进度信息写入持久存储 - 当您知道处理的最后一个成功位时,这也将为您带来轻松重试的好处。
如果外部线程/进程轮询您要导入的目标,并且您将在某处获得有关要导入的总项目的信息,则它也可以确定状态。
Quartz.NET 作业是作为一个......井单元进行处理的单元,因此不存在还有多少工作要做的概念。或者您在另一项依赖于导入流程的工作中需要此信息吗?