Quartz.Net 工作进度

Jan*_*ger 3 c# quartz-scheduler

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

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

Evg*_*nyt 6

这是很有可能。

我会用这样的东西。在职:

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之后访问它。


Mar*_*hma 2

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

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

Quartz.NET 作业是作为一个......井单元进行处理的单元,因此不存在还有多少工作要做的概念。或者您在另一项依赖于导入流程的工作中需要此信息吗?