Как отключить повторные задания на панели инструментов hangfire

В настоящее время на панели инструментов Hangfire есть возможность повторно ставить задания в очередь (успешные или неудачные), и в моем случае выполнение дважды задания может вызвать проблемы.

Я попытался добавить атрибут AutomaticRetry ...

[AutomaticRetry(Attempts = 0)]

Это решает проблему, когда задания не выполняются, задания не ставятся в очередь автоматически, но кнопка все еще находится на панели управления, и их можно повторно поставить в очередь вручную.

У вас есть база данных, подключенная к этому проекту? Если это так, вы можете использовать вызовы ajax и сохранить настройки в записи базы данных.

GeorgeB 28.08.2018 17:02

Не думайте, что изменять БД без использования реального API Hangfire - это хорошая идея.

agascon 29.08.2018 08:58
8
2
2 680
3

Ответы 3

Как насчет удаления работы?

RecurringJob.RemoveIfExists("myJobID");

Это не поможет, так как мы говорим о разовых пожарах и забвении работы. В атрибуте AutomaticRetry есть опция ... OnAttemptsExceeded = AttemptsExceededAction.Delete, но она тоже не поможет. Удаленное задание можно поставить в очередь.

agascon 28.08.2018 10:45

Как предлагает odinserj на Обсуждение Hangfire.

Вы можете просто использовать условие внутри повторяющегося задания и сохранить его в своей базе данных, чтобы предотвратить выполнение задания:

public void MyMethod()
{
    if (someCondition) { return; }

    /* ... */
}

Некоторые проверки уже выполнены, и в противном случае задание не запустится, но кнопка все равно есть. Я чувствую, что у какого-то оператора приложения может возникнуть соблазн использовать его, и в любом случае это сбивает с толку.

agascon 29.08.2018 08:58

В настоящее время нет возможности заставить Hangfire прекратить выполнение заданий. Например, если у вас возникла проблема с одной из служб, которые используются в заданиях, и вы хотите остановить зависание до разрешения проблемы.

Идея состоит в том, чтобы ваша работа вызывала исключение. Затем он перейдет в состояние сбоя и, в зависимости от настроек AutomaticRetry, попытается повторно запустить задание, если необходимо, автоматически (до определенного количества повторных попыток) или останется там, чтобы после решения проблемы вы могли вручную повторно запустить задание из приборная панель.

Не рекомендуется сидеть на работе и ждать, пока служба вернется в сеть (в общем, я, очевидно, не очень хорошо знаю ваш конкретный сценарий).

В целом я считаю, что даже очень осторожно отношусь даже к автоматическим повторным попыткам. Я даже рассматриваю возможность сделать это только в том случае, если у меня есть гарантия, что все, что делает задание, является идемпотентным (т.е. выполнение одних и тех же действий несколько раз не вызывает проблем).

Представьте себе работу, которая добавляет 100 долларов к зарплате каждого сотрудника в компании (т.е. установлена ​​зарплата = зарплата + 100). Вы запускаете задание по обновлению БД, но на полпути соединение с сервером БД разрывается. Половине сотрудников повысили зарплату, другая половина еще не получила. Повторное выполнение того же задания не должно применять увеличение на 100 долларов во второй раз к тем сотрудникам, которые были выполнены в первом запуске.

Остановка всего сервера также кажется немного резкой. Я считаю, что рекомендуемый механизм - просто удалить задание, если вы не хотите, чтобы задание (если оно повторяющееся, а не пожар и забвение) на некоторое время ставило в очередь новые запуски. Затем, когда проблема будет решена, вы просто перенесете ее. Я согласен с тем, что было бы неплохо иметь функцию паузы. Для этого вы можете расширить Hangfire, используя фильтры заданий и IElectStateFilters. Просто имейте где-нибудь логическое значение (например, IsHangfirePaused = true), которое вы можете проверить в событии OnStateElection и предотвратить переход задания в EnqueuedState, если для него установлено значение true.

это согласно https://discuss.hangfire.io/t/ability-to-stop-running-jobs/4215/2

Это не имеет отношения к вопросу. Проблема в том, что невыполненное задание может быть повторно поставлено в очередь на панели управления, и я хочу это отключить.

agascon 29.08.2018 10:06

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