#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
Ответ №1:
Я бы использовал отложенное задание, которое может дать больше контроля. После выполнения задания поместите само задание в отложенную очередь с заданным интервалом задержки.
Более того, API Hangfire monitor также может быть способом достичь этого.
Комментарии:
1. Это может быть идея, но как насчет устойчивости? Что, если задание завершится до того, как оно запланирует следующее? Я взглянул на API мониторинга, но не смог найти ничего, что помогло бы мне достичь этого. Не могли бы вы любезно предоставить несколько указаний?
2. Согласно исходному коду, они раскрывают
NextExecution
. github.com/HangfireIO/Hangfire/blob/master/src/Hangfire.Core /… . Что касается сбоя задания, Hangfire предоставляет функции повтора, чтобы сделать все возможное для выполнения заданий, которые вы можете использоватьcontinueWith
для регистрации обратного вызова сбоя.3. Они предоставляют
NextExecution
свойство, но я бы предпочел избегать вычислений внутри выполнения задания, поскольку это может усложниться при запуске в нескольких экземплярах. Более того, это не сработает, если пропущенные задания запускаются вручную после перезагрузки сервера. На данный момент использование запланированного задания, которое само ставится в очередь, кажется более безопасным решением (явно передавая правильную дату и время запуска).