Hangfire - настроить AutomaticRetry для указания c RecurringJob во время выполнения - PullRequest
2 голосов
/ 13 марта 2020

Я использую Hangfire v1.7.9 и пытаюсь настроить серию повторяющихся фоновых заданий в моем приложении MVC 5 для автоматизации извлечения внешних справочных данных в приложение. Я проверил это с помощью одной задачи, и это прекрасно работает, но я хотел бы, чтобы администраторы системы могли настраивать параметры атрибута Attempts и DelayInSeconds, связанные с методом, вызываемым в этих фоновых заданиях.

AutomaticRetryAttribute утверждает, что вы должны использовать ...

... константное выражение, выражение typeof или выражение создания массива типа параметра атрибута

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

Кроме того, оно не выглядит как любой способ настроить автоматические свойства c retry в методах BackgroundJob.Enqueue или RecurringJob.AddOrUpdate. Наконец, я посмотрел, можно ли использовать заданный c счетчик повторов для каждой именованной очереди, но, увы, единственные свойства очередей Hangfire, которые вы можете установить, - это их имена в классе BackgroundJobServerOptions при инициализации сервера Hangfire.

Я исчерпал каждую авеню здесь? Единственное, о чем я могу думать, - это создать собственную реализацию AutomaticRetryAttribute и установить значения во время компиляции с помощью int enum, хотя это само по себе создаст проблему в том смысле, что я необходимо предоставить определенный список каждого из значений, которые пользователь должен будет выбрать. Поскольку я хотел, чтобы количество повторных попыток конфигурировалось от 5 минут до 1440 минут (24 часа), я действительно не хочу огромных, громоздких enum : int с каждым доступным значением. Кто-нибудь когда-либо сталкивался с этой проблемой, или это то, что я должен отправить в качестве запроса на Hangfire GitHub?

1 Ответ

2 голосов
/ 13 марта 2020

Я бы применил подход к созданию пользовательского атрибута, который украшает AutomaticRetryAttribute:

public class MyCustomRetryAttribute : JobFilterAttribute, IElectStateFilter, IApplyStateFilter
{
    public void OnStateElection(ElectStateContext context)
    {
        GetAutomaticRetryAttribute().OnStateElection(context);
    }

    public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
    {
        GetAutomaticRetryAttribute().OnStateApplied(context, transaction);
    }

    public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
    {
        GetAutomaticRetryAttribute().OnStateUnapplied(context, transaction);
    }

    private AutomaticRetryAttribute GetAutomaticRetryAttribute()
    {
        // Somehow instantiate AutomaticRetryAttribute with dynamically fetched/set `Attempts` value
        return new AutomaticRetryAttribute { Attempts = /**/ };
    }
}

Редактировать: Чтобы уточнить, этот метод позволяет повторно использовать логи AutomaticRetryAttribute c, без дублируя это. Однако, если вам нужно изменить больше аспектов для каждой работы, вам может потребоваться продублировать логи c внутри вашего собственного атрибута.

Также вы можете использовать context.GetJobParameter<T> для хранения произвольных данных в -основная работа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...