[英]How can I get a Hangfire job's end time?
給定一個 Hangfire 作業的 ID,我如何獲得作業完成運行的時間?
我已經嘗試過以下方法,但JobData
class 沒有作業結束時間的屬性。
IStorageConnection connection = JobStorage.Current.GetConnection();
JobData jobData = connection.GetJobData(jobId);
我之前也有過類似的要求。 這是我編寫的一個方法,用於使用正在運行的方法的名稱和當前的PerformContext
獲取SucceededAt
屬性:
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
屬性),這里有一個參考: 如何配置作業的保留時間?
您可以在第一次調用任務時嘗試使用 秒表 class並在任務完成時停止它。
然后,您可以使用日志塊生成包含作業開始時間和結束時間的 txt 日志文件。 或者直接將此值保存到您的數據庫中,以便您以后查看它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.