Как сделать так, чтобы задания по подбору Hangfire ставились в очередь за последний час? - PullRequest
1 голос
/ 27 мая 2019

Мое требование - обрабатывать только последние задания и игнорировать старые задания.Как мне настроить это в 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);
    }
}

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Вы можете сделать что-то похожее на это:

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." };
        }
    }
}

Он просто перемещает задания после истечения срока их действия в успешные, а не обрабатывает их.Я вообще не проверял, но в целом должен быть правильным.

0 голосов
/ 19 июня 2019

Другим вариантом (или, возможно, в качестве отказоустойчивого механизма) является проверка даты и времени создания задания при его запуске. Недостатком является то, что задание будет поставлено в очередь и помечено как выполненное.

public static void MyJob(PerformContext context)
{
    if (DateTime.Now.Subtract(context.BackgroundJob.CreatedAt).TotalHours >= 1)
    {
        // Job is older than 1 hour
        return;
    }

    // Process job...
}
...