簡體   English   中英

如何獲得 Hangfire 工作的結束時間?

[英]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;
}

你可以很容易地得到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屬性),這里有一個參考: 如何配置作業的保留時間?

您可以在第一次調用任務時嘗試使用 秒表 class並在任務完成時停止它。

然后,您可以使用日志塊生成包含作業開始時間和結束時間的 txt 日志文件。 或者直接將此值保存到您的數據庫中,以便您以后查看它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM