Как сделать так, чтобы задания по подбору Hangfire ставились в очередь за последний час?
Мое требование - обрабатывать только последние работы и игнорировать старые. Как мне настроить это в Hangfire?
Я попытался IApplyStateFilter для установки ExpirationAttribute
public class ExpirationAttribute : JobFilterAttribute, IApplyStateFilter
{
private int _hours;
public ExpirationAttribute(int hours)
{
_hours = hours;
}
public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
{
context.JobExpirationTimeout = TimeSpan.FromHours(_hours);
}
public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
{
context.JobExpirationTimeout = TimeSpan.FromHours(_hours);
}
}
0 ответов
Вы можете сделать что-то похожее на это:
public class ExpirationAttribute : JobFilterAttribute, IElectStateFilter
{
private int _hours;
public ExpirationAttribute(int hours)
{
_hours = hours;
}
public void OnStateElection(ElectStateContext context)
{
var processing = context.CandidateState as ProcessingState;
if (processing == null)
{
return;
}
if (DateTime.UtcNow - context.BackgroundJob.CreatedAt > TimeSpan.FromHours(_hours))
{
context.CandidateState = new SucceededState(new { }, 0, 0) { Reason = "Execution skipped due to expiration." };
}
}
}
Он просто перемещает задания после истечения срока их действия к успешному, а не обрабатывает их. Я не проверял это вообще, но должно быть в целом правильно.
Другой вариант (или, возможно, в качестве отказоустойчивого механизма) заключается в проверке даты и времени создания задания при его запуске. Недостатком является то, что задание будет поставлено в очередь и помечено как выполненное.
public static void MyJob(PerformContext context)
{
if (DateTime.Now.Subtract(context.BackgroundJob.CreatedAt).TotalHours >= 1)
{
// Job is older than 1 hour
return;
}
// Process job...
}