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

标签 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();
    }
}

Web API 是发布职位的地方(即调用 BackgroundJob.Enqueue(() => ...))。我没有更改执行实际工作的客户端的配置。

如果我现在发布一个工作并且它成功了,它仍然有一天的有效期,正如您在屏幕截图中看到的那样,它显示了仪表板和 HangfireDb 中的条目,

enter image description here

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

最佳答案

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

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

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

然后就可以了。 Hangfire 文档可能会更清楚地说明应在何处配置过滤器。

关于c# - 设置 Hangfire 成功的作业到期属性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42485548/

相关文章:

c# - 使用正则表达式替换坏词

C#网络编程与资源使用

c# - 使用默认队列时类型不包含方法

c# - Hangfire 后台作业保持排队

date - HangFire延迟了日期的任务

C#注释技术/注释重用

c# - DDD ASP MVC 验证最佳实践

c# - 永不运行的 Hangfire cron 表达式

c# - 在 ASP.NET Core RC2 应用程序中定期运行后台任务

c# - 如何在 WPF 中创建 KeyEventArgs 对象(与 SO 答案相关)