鉴于Hangfire作业的ID,我如何获取作业完成运行的时间?
我尝试了以下操作,但是JobData
类没有作业结束时间的属性。
IStorageConnection connection = JobStorage.Current.GetConnection();
JobData jobData = connection.GetJobData(jobId);
答案 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;
}
您可以轻松获得DeletedJobs
,EnqueuedJobs
,FailedJobs
等。
您可以从这样的作业方法中调用它:
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日志文件,其中包含作业的开始时间和结束时间。或直接将此值保存到数据库中,以便以后查看。