作业失败时在 Hangfire 作业过滤器中获取作业参数
Get a parameter of a job in Hangfire job filter when Job Failed
为了在工作失败时发送电子邮件,我正在尝试实现这样的功能:Hangfire send emails after retry .
但是我需要访问执行的作业方法的参数。这个参数对应一个公司的ID,我需要这个想法才能知道我应该使用哪个connectionString来访问db。
我需要在这里访问一个数据库,以了解我们是否已经为当前的工作发送了一封电子邮件(以免每次相同的工作失败时都发送垃圾邮件)。
所以我会有这样的东西:
- 作业 A 运行
- 作业 A 失败
- Job A Filter 被执行,
- Job A Filter 在数据库中检查是否已经为该职位发送了电子邮件
- 如果没有发送电子邮件给管理员
- 在 db 中添加一条记录,以表明已为此工作发送了一封电子邮件
- 作业 A 运行
- 作业 A 失败
- Job A Filter再次执行
- Job A 过滤器不会发送电子邮件,因为它已经发送
等等...
我不知道这是否是正确的方法,如果你们有任何改进的想法,请随意!
但是,我的问题仍然是我可以访问已执行作业方法的参数来了解公司 ID 吗?或者当作业执行失败时,有什么方法可以将作业方法中的数据提供给 AttributeFilter(如袋子等...)?
感谢阅读我!
我会用 IApplyStateFilter
尝试这样的事情
public class NotifyExceptionsServerFilter : IApplyStateFilter
{
public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
{
var c = context.NewState as FailedState;
if (c?.Exception != null && context.Job.Method.Name == "YourMethodName")
{
var companyId = context.Job.Args[CompanyIdArgumentIndexInYourMethodSignature];
// Do stuff using CompanyId
}
}
public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
{
}
}
大致思路是这样的。如果它能工作,它至少需要通过特定的测试来保护,以防止重构引起的错误,因为它依赖于反射。
为了在工作失败时发送电子邮件,我正在尝试实现这样的功能:Hangfire send emails after retry .
但是我需要访问执行的作业方法的参数。这个参数对应一个公司的ID,我需要这个想法才能知道我应该使用哪个connectionString来访问db。
我需要在这里访问一个数据库,以了解我们是否已经为当前的工作发送了一封电子邮件(以免每次相同的工作失败时都发送垃圾邮件)。
所以我会有这样的东西:
- 作业 A 运行
- 作业 A 失败
- Job A Filter 被执行,
- Job A Filter 在数据库中检查是否已经为该职位发送了电子邮件
- 如果没有发送电子邮件给管理员
- 在 db 中添加一条记录,以表明已为此工作发送了一封电子邮件
- Job A Filter 在数据库中检查是否已经为该职位发送了电子邮件
- 作业 A 运行
- 作业 A 失败
- Job A Filter再次执行
- Job A 过滤器不会发送电子邮件,因为它已经发送 等等...
我不知道这是否是正确的方法,如果你们有任何改进的想法,请随意!
但是,我的问题仍然是我可以访问已执行作业方法的参数来了解公司 ID 吗?或者当作业执行失败时,有什么方法可以将作业方法中的数据提供给 AttributeFilter(如袋子等...)?
感谢阅读我!
我会用 IApplyStateFilter
public class NotifyExceptionsServerFilter : IApplyStateFilter
{
public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
{
var c = context.NewState as FailedState;
if (c?.Exception != null && context.Job.Method.Name == "YourMethodName")
{
var companyId = context.Job.Args[CompanyIdArgumentIndexInYourMethodSignature];
// Do stuff using CompanyId
}
}
public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
{
}
}
大致思路是这样的。如果它能工作,它至少需要通过特定的测试来保护,以防止重构引起的错误,因为它依赖于反射。