如何获得Hangfire工作的结束时间?

时间:2019-09-30 20:10:54

标签: c# asp.net-core hangfire

鉴于Hangfire作业的ID,我如何获取作业完成运行的时间?

我尝试了以下操作,但是JobData类没有作业结束时间的属性。

IStorageConnection connection = JobStorage.Current.GetConnection();
JobData jobData = connection.GetJobData(jobId);

2 个答案:

答案 0 :(得分:1)

我以前也有类似的要求。这是我编写的一种方法,它使用运行方法的名称和当前的SucceededAt来获取PerformContext属性:

public static DateTime? GetCompareDate(PerformContext context, string methodName)
{
    return long.TryParse(context.BackgroundJob.Id, out var currentJobId)
        ? JobStorage.Current
            ?.GetMonitoringApi()
            ?.SucceededJobs(0, (int)currentJobId)
            ?.LastOrDefault(x => x.Value?.Job?.Method?.Name == methodName).Value?.SucceededAt
        : null;
}

您可以轻松获得DeletedJobsEnqueuedJobsFailedJobs等。

您可以从这样的作业方法中调用它:

public async Task SomeJob(PerformContext context, CancellationToken token)
{
    ⋮
    var compareDate = GetCompareDate(context, nameof(SomeJob));
    ⋮
}

通过传递PerformContext来添加作业时,您只需添加null

RecurringJobManager.AddOrUpdate(
        recurringJobId: "1",
        job: Job.FromExpression(() => SomeJob(null, CancellationToken.None)),
        cronExpression: Cron.Hourly(15),
        options: new RecurringJobOptions
        {
            TimeZone = TimeZoneInfo.Local
        });

注意:仅当成功的作业尚未过期时,它才有效。成功的工作将在一天后过期-如果您需要保留更长的时间(以获取SucceededAt属性),请参考以下内容:How to configure the retention time of job?

答案 1 :(得分:0)

您可以在初次调用任务时尝试使用Stopwatch class,并在任务完成时停止使用它。

然后,您可以使用日志块来生成txt日志文件,其中包含作业的开始时间和结束时间。或直接将此值保存到数据库中,以便以后查看。