首页 > 解决方案 > 如何让 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);
    }
}

标签: hangfirehangfire-autofac

解决方案


你可以做类似这样的事情:

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

它只是将过期的作业移至成功,而不是处理它们。我根本没有测试过它,但通常应该是正确的。


推荐阅读