Как получить запланированную дату и время выполнения внутри повторяющегося задания Hangfire?

#c# #.net-core #aspnetboilerplate #hangfire #abp

#c# #.net-core #aspnetboilerplate #hangfire #abp

Вопрос:

Я пытаюсь перенести существующий проект ABP, поддерживаемый Quartz.NET на Виселицу.

У меня повторяющееся задание, и мне нужно получить запланированное время выполнения внутри задания. Обратите внимание, что мне не нужно реальное время выполнения, а скорее ожидаемое. Предположим, что у меня есть повторяющееся задание, запланированное на каждый понедельник в 10:00 утра; Когда задание выполняется, мне нужно получить дату и время, указывающие текущий понедельник в 10 утра.

Мне не хватает какого-либо свойства PerformContext или JobData?

 public class TestJob : BackgroundJob<PerformContext>, ITransientDependency
{
    private readonly IRepository<User, long> _usersRepository;

    public TestJob(IRepository<User, long> usersRepository)
    {
        _usersRepository = usersRepository;
    }

    public override void Execute(PerformContext context)
    {
        var jobData = context.Connection.GetJobData(context.BackgroundJob.Id);

        // How to get planned execution time for this job run?
    }
}
  

Если бы мое повторяющееся задание планировалось запускать каждый час, а мой сервер не работает в течение 5 часов, мне действительно нужно было бы выполнить все 5 пропущенных запусков, и для каждого из них я ожидал бы ссылки на правильное запланированное время даты. Есть ли у вас какие-либо предложения о том, как это сделать?

Ту же информацию можно найти в Quartz под IJobExecutionContext.ScheduledFireTimeUtc

Ссылка для обсуждения Hangfire

Ответ №1:

Я бы использовал отложенное задание, которое может дать больше контроля. После выполнения задания поместите само задание в отложенную очередь с заданным интервалом задержки.

Более того, API Hangfire monitor также может быть способом достичь этого.

Комментарии:

1. Это может быть идея, но как насчет устойчивости? Что, если задание завершится до того, как оно запланирует следующее? Я взглянул на API мониторинга, но не смог найти ничего, что помогло бы мне достичь этого. Не могли бы вы любезно предоставить несколько указаний?

2. Согласно исходному коду, они раскрывают NextExecution . github.com/HangfireIO/Hangfire/blob/master/src/Hangfire.Core /… . Что касается сбоя задания, Hangfire предоставляет функции повтора, чтобы сделать все возможное для выполнения заданий, которые вы можете использовать continueWith для регистрации обратного вызова сбоя.

3. Они предоставляют NextExecution свойство, но я бы предпочел избегать вычислений внутри выполнения задания, поскольку это может усложниться при запуске в нескольких экземплярах. Более того, это не сработает, если пропущенные задания запускаются вручную после перезагрузки сервера. На данный момент использование запланированного задания, которое само ставится в очередь, кажется более безопасным решением (явно передавая правильную дату и время запуска).