设置Hangfire成功的作业到期属性不起作用

时间:2017-02-27 12:12:52

标签: c# hangfire

我正在使用Hangfire来完成工作,我想改变一天后从数据库中删除成功的行为 - 我希望它们存储一年。

按照此thread中的说明(与this SO question相同),我创建了一个类:

public class OneYearExpirationTimeAttribute : JobFilterAttribute, IApplyStateFilter
{
    public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
    {
        context.JobExpirationTimeout = TimeSpan.FromDays(365);
    }

    public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
    {
        context.JobExpirationTimeout = TimeSpan.FromDays(365);
    }
}

我在我的Asp.net web api启动类中将其注册为全局过滤器:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // ... other stuff here ...
        GlobalJobFilters.Filters.Add(new OneYearExpirationTimeAttribute());
        GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDBConnection");
        app.UseHangfireDashboard();
    }
}

网络API是发布工作的地方(即发生对BackgroundJob.Enqueue(() => ...)的调用)。我没有改变执行实际工作的客户端的配置。

如果我现在发布一份工作并且成功,它仍然有一天的到期时间,你可以在屏幕截图中看到,它显示了仪表板和HangfireDb中的条目,

enter image description here

我做错了什么或我错过了什么?

2 个答案:

答案 0 :(得分:1)

我在设置中的错误是该属性设置在错误的应用程序上。正如我在问题中所述,我在asp.net web api的startup.cs文件中添加了过滤器,其中发布了作业。

相反,我应该在正在执行作业的控制台应用程序中添加配置,即我的控制台应用程序以

开头
static void Main(string[] args)
{
    GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDBConnection");
    GlobalJobFilters.Filters.Add(new OneYearExpirationTimeAttribute());
    // ... more stuff ...
}

然后它有效。 Hangfire文档可以更清楚地说明应该在哪里配置过滤器。

答案 1 :(得分:0)

使用版本:

// Type: Hangfire.JobStorage
// Assembly: Hangfire.Core, Version=1.7.11.0, Culture=neutral, PublicKeyToken=null

这可以直接(明显地)完成

    JobStorage.Current.JobExpirationTimeout = TimeSpan.FromDays(6 * 7);