如何访问失败的Hangfire作业

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何访问失败的Hangfire作业相关的知识,希望对你有一定的参考价值。

我目前正在开发使用hangfire的EmailNotification模块。唯一的问题是在尝试10次之后,如果在我的情况下hangfire未能(安排工作)电子邮件,我无法找到通过代码获得有关的更新。

我知道这个事实,我可以通过配置hangfire来访问hangfire - dashboard,如下所示:

public void ConfigureHangfire(IAppBuilder app)
{
    var container = AutofacConfig.RegisterBackgroundJobComponents();
    var sqlOptions = new SqlServerStorageOptions
    {
        PrepareSchemaIfNecessary = Config.CreateHangfireSchema
    };
    Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("hangfire", sqlOptions);
    Hangfire.GlobalConfiguration.Configuration.UseAutofacActivator(container);
    var options = new BackgroundJobServerOptions() {Queues = new[] {"emails"}};
    app.UseHangfireDashboard();
    app.UseHangfireServer(options);
}

但问题是我无法找到以编程方式访问失败作业的方法。我想知道是否有人遇到过这个问题,想知道细节。

答案

您可以使用Hangfire作业过滤器。作业过滤器允许你扩展hangfire的功能,你可以用它们做许多有趣的事情(更多细节请参见官方文档here

创建一个从JobFilterAttribute扩展的类

然后实现IElectStateFilter接口。此接口为您提供了一个方法OnStateElection,当作业的当前状态被更改为指定的候选状态时调用FailedState,例如public class MyCustomFilter : JobFilterAttribute, IElectStateFilter { public void IElectStateFilter.OnStateElection(ElectStateContext context) { var failedState = context.CandidateState as FailedState; if (failedState != null) { //Job has failed //Job ID => context.BackgroundJob.Id, //Exception => failedState.Exception } } }

GlobalJobFilters.Filters.Add(new MyCustomFiler());

然后,注册此属性 -

IApplyStateFilter

如果需要捕获事件,则在应用状态后,您可以实现qazxswpoi。

以上是关于如何访问失败的Hangfire作业的主要内容,如果未能解决你的问题,请参考以下文章

是什么原因导致天蓝色托管的hangfire作业具有这种行为?

Hangfire Server 是不是可以访问应用程序中的敏感数据?

应用程序池回收后,Hangfire 重复作业停止

当 Hangfire 并行处理多个作业时,为啥 MySQL InnoDB 会产生如此多的死锁?

在没有数据库存储的情况下使用 HangFire 进行后台作业处理?

是否可以使用 dotNet 使用 Hangfire 每 20 秒运行一次作业?