我正在使用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中的条目,
我做错了什么或我错过了什么?
最佳答案 我在设置中的错误是该属性设置在错误的应用程序上.正如我在问题中所述,我在asp.net web api的startup.cs文件中添加了过滤器,其中发布了作业.
相反,我应该在正在执行作业的控制台应用程序中添加配置,即我的控制台应用程序以
static void Main(string[] args)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDBConnection");
GlobalJobFilters.Filters.Add(new OneYearExpirationTimeAttribute());
// ... more stuff ...
}
然后它工作. Hangfire文档可以更清楚地说明应该配置过滤器的位置.