Как получить PerformContext из API Hangfire

В нашем проекте мы используем шаблон aspnetzero. Этот шаблон позволяет простое, но абстрактное использование hangfire. Теперь мы хотели бы добавить Hangfire.Console в наш проект, который позволил бы нам записывать логи на панель мониторинга hangfires.

Чтобы записать оператор журнала в консоль панели мониторинга, мы должны получить доступ к PerformContext текущего выполняемого задания. К сожалению, из-за абстракции в aspnetzero мы не можем внедрить PerformContext, как это было бы запланировано Hangfire. У нас есть доступ к пространству имен hangfire и всем его статическим объектам.

Поэтому мой вопрос: есть ли способ получить PerformContext другим способом, нежели передача нулевого значения методу выполнения?

Что я уже пробовал:

  • При использовании интерфейса IServerFilter должен вызываться метод OnPerforming. Но, к сожалению, это не относится к фоновым заданиям aspnetzero.
  • Я попытался переписать / расширить данный базовый класс BackgroundJob aspnetzero, но безуспешно. Возможно, кто-то может дать мне подсказку в этом направлении.

3 ответа

я использовал 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

И де метод

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

Вы никогда не должны использовать для этого статическое поле, даже если оно помечено ThreadStaticAttribute , пожалуйста, обратитесь к этой ссылке для получения более подробной информации.

https://discuss.hangfire.io/t/use-hangfire-job-id-in-the-code/2621/2

Я также страдал, используя реализацию заданий зависания abp. Я не знаю, как точно ответить на ваш вопрос, но мне удалось получить доступ кPerformingContext путем реализации атрибута, расширяющего JobFilterAttribute и реализует IClientFilter, IServerFilter, IElectStateFilter, IApplyStateFilter. Интерфейсы будут зависеть от ваших требований, но я смог получить доступPerformingContext сюда.

Другие вопросы по тегам