设置 Hangfire 成功的作业到期属性不起作用
Set Hangfire succeeded job expiry attribute not working
我正在使用 Hangfire 做作业,我想更改在一天后从数据库中删除成功作业的行为 - 我希望将它们存储一年。
按照 thread, which is the same as in 中的说明,我创建了一个 class:
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 网络 api 启动 class 中将其注册为全局过滤器:
public class Startup
{
public void Configuration(IAppBuilder app)
{
// ... other stuff here ...
GlobalJobFilters.Filters.Add(new OneYearExpirationTimeAttribute());
GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDBConnection");
app.UseHangfireDashboard();
}
}
网络 api 是 post 工作的地方(即调用 BackgroundJob.Enqueue(() => ...)
)。我没有更改执行实际工作的客户端的配置。
如果我现在 post 一份工作并且它成功了,它仍然有一天的有效期,正如您在屏幕截图中看到的那样,它显示了仪表板和 HangfireDb 中的条目,
我做错了什么或错过了什么?
我在设置中的错误是在错误的应用程序上设置了属性。正如我在问题中所述,我在发布职位的 asp.net 网站 api 的 startup.cs 文件中添加了过滤器。
相反,我应该在执行作业的控制台应用程序中添加配置,即我的控制台应用程序以
开头
static void Main(string[] args)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDBConnection");
GlobalJobFilters.Filters.Add(new OneYearExpirationTimeAttribute());
// ... more stuff ...
}
然后就可以了。 Hangfire 文档可能会更清楚地说明过滤器的配置位置。
使用版本:
// Type: Hangfire.JobStorage
// Assembly: Hangfire.Core, Version=1.7.11.0, Culture=neutral, PublicKeyToken=null
这可以直接完成(显然)
JobStorage.Current.JobExpirationTimeout = TimeSpan.FromDays(6 * 7);
我正在使用 Hangfire 做作业,我想更改在一天后从数据库中删除成功作业的行为 - 我希望将它们存储一年。
按照 thread, which is the same as in
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 网络 api 启动 class 中将其注册为全局过滤器:
public class Startup
{
public void Configuration(IAppBuilder app)
{
// ... other stuff here ...
GlobalJobFilters.Filters.Add(new OneYearExpirationTimeAttribute());
GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDBConnection");
app.UseHangfireDashboard();
}
}
网络 api 是 post 工作的地方(即调用 BackgroundJob.Enqueue(() => ...)
)。我没有更改执行实际工作的客户端的配置。
如果我现在 post 一份工作并且它成功了,它仍然有一天的有效期,正如您在屏幕截图中看到的那样,它显示了仪表板和 HangfireDb 中的条目,
我做错了什么或错过了什么?
我在设置中的错误是在错误的应用程序上设置了属性。正如我在问题中所述,我在发布职位的 asp.net 网站 api 的 startup.cs 文件中添加了过滤器。
相反,我应该在执行作业的控制台应用程序中添加配置,即我的控制台应用程序以
开头static void Main(string[] args)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDBConnection");
GlobalJobFilters.Filters.Add(new OneYearExpirationTimeAttribute());
// ... more stuff ...
}
然后就可以了。 Hangfire 文档可能会更清楚地说明过滤器的配置位置。
使用版本:
// Type: Hangfire.JobStorage
// Assembly: Hangfire.Core, Version=1.7.11.0, Culture=neutral, PublicKeyToken=null
这可以直接完成(显然)
JobStorage.Current.JobExpirationTimeout = TimeSpan.FromDays(6 * 7);