【问题标题】:Hangfire ServerName from Context来自上下文的 Hangfire ServerName
【发布时间】:2019-09-20 16:08:30
【问题描述】:

我们正在尝试从正在运行的后台作业中获取 Hangfire ServerName。这可能吗?如果可以,怎么做?

到目前为止,我们已经查看了 ProcessContext 对象,但它似乎不包括 ServerName。

感谢您的帮助。

【问题讨论】:

    标签: c# .net hangfire


    【解决方案1】:

    盲拍(未经测试),但我会尝试使用IApplyStateFilter 进行类似的操作:

    public class GetServerIdFilter : IApplyStateFilter
    {
        public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
        {
            var state = context.NewState as ProcessingState;
            if (state != null)
            {
                var serverId = state.ServerId;
                var workerId = state.WorkerId;
            }
        }
    
        public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
        {
        }
    }
    

    过滤器可以注册为this answer

    【讨论】:

      【解决方案2】:

      我知道以下内容并不能完全回答您关于从工作中阅读它的问题,据我所知,这看起来是不可能的。如果不可能,这个答案可能会有所帮助,所以你去吧。

      我不确定是否可以从某个地方读取它。

      无论如何,Hangfire 文档here 阅读您可以手动处理服务器名称:

      由于默认值仅在进程级别提供唯一性,因此如果您想在同一进程中运行不同的服务器实例,则应手动处理:

      var options = new BackgroundJobServerOptions
          {
              ServerName = String.Format(
                  "{0}.{1}",
                  Environment.MachineName,
                  Guid.NewGuid().ToString())
          };
      
          var server = new BackgroundJobServer(options);
      
          // or
      
          app.UseHangfireServer(options);
      

      【讨论】:

      • 谢谢。我们使用BackgroundJobServerOptions 来创建服务器,但我们试图解决的问题是如何在多服务器情况下获取正在使用哪个服务器来运行作业。我们需要知道在执行作业时选择池中的哪个服务器。
      猜你喜欢
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      相关资源
      最近更新 更多