Как получить 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
сюда.