如何从hangfire API 获取 PerformContext

Posted

技术标签:

【中文标题】如何从hangfire API 获取 PerformContext【英文标题】:How to get the PerformContext from hangfire API 【发布时间】:2020-01-01 18:20:13 【问题描述】:

在我们的项目中,我们使用的是 aspnetzero 模板。该模板允许简单但抽象地使用hangfire。现在我们想将Hangfire.Console 添加到我们的项目中,这将允许我们将日志写入hangfires 仪表板。

为了将日志语句写入仪表板控制台,我们必须访问当前正在运行的作业的 PerformContext。不幸的是,由于aspnetzero 中的抽象,我们不能inject the PerformContext,因为它会由hangfire 计划。我们可以访问的是 hangfire 命名空间和所有它的静态对象。

因此我的问题是:除了将 null 传递给执行方法之外,还有其他方法可以获取 PerformContext 吗?

到目前为止我所做的尝试:

通过使用 IServerFilter 接口,应该调用方法 OnPerforming。但不幸的是,在 aspnetzero 后台作业中并非如此。 我试图覆盖/扩展 aspnetzero 的给定基类 BackgroundJob,但没有成功。也许有人可以在这个方向上给我一个提示。

【问题讨论】:

【参考方案1】:

我使用JobFilterAttribute IServerFilter

例子:

[AttributeUsage(AttributeTargets.Class)]
 public class HangFirePerformContextAttribute : JobFilterAttribute, IServerFilter

         private static PerformContext _Context;

        public static PerformContext PerformContext
        
            get
            
                return new PerformContext(_Context);
            
        
        public void OnPerformed(PerformedContext filterContext)
        
            Context = (PerformContext)filterContext;
            _Context = Context;
        
        public void OnPerforming(PerformingContext filterContext)
        
            Context = (PerformContext)filterContext;
            _Context = Context;
        

我创建了一个新类AsyncBackgroundJobHangFire<TArgs> : AsyncBackgroundJob<TArgs>

示例:

    [HangFirePerformContext]
    public abstract class AsyncBackgroundJobHangFire<TArgs> : AsyncBackgroundJob<TArgs>
    
        public PerformContext Context  get; set; 

        protected async override Task ExecuteAsync(TArgs args)
        
            Context = HangFirePerformContextAttribute.PerformContext;
            await ExecuteAsync(args, Context);
        

        protected abstract Task ExecuteAsync(TArgs args, PerformContext context);
    

它的工作

在一类工作中,我使用AsyncBackgroundJobHangFire

而de方法是

        [UnitOfWork]
        protected override async Task ExecuteAsync(string args, PerformContext context)
        
        

【讨论】:

再补充一点,你可以把它放在你的hangfire启动/配置附近的某个地方(至少在.NET框架上!)GlobalConfiguration.Configuration.UseFilter(new HangFirePerformContextAttribute());【参考方案2】:

我在使用 abp 的 hangfire 作业实施时也遇到了麻烦。我不知道如何准确回答您的问题,但我能够通过实现扩展JobFilterAttribute 并实现IClientFilter, IServerFilter, IElectStateFilter, IApplyStateFilter 的属性来访问PerformingContext。接口取决于您的要求,但我可以通过这种方式访问​​PerformingContext

【讨论】:

这是作为答案发布的,但它不会尝试回答问题。应该是评论。 没有样本,你说的话不容易推理。这很可能是评论而不是真正的答案。

以上是关于如何从hangfire API 获取 PerformContext的主要内容,如果未能解决你的问题,请参考以下文章

Hangfire 每 15 秒获取一次数据库

Hangfire源码解析-任务是如何执行的?

ABP官方文档翻译 7.2 Hangfire集成

如何访问失败的Hangfire作业

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

hangfire代码里把方法删了 还能继续执行