Старые серверы Hangfire продолжают возвращаться и запускать старый код

#.net #asp.net-mvc #asp.net-core #.net-core #hangfire

Вопрос:

Я использую Hangfire.AspNetCore версии 1.7.25 в моем веб-приложении .NET Core 2.2 для выполнения фоновой работы.

Я использую сервисы.Добавьте Hangfire и сервисы.Добавьте настройки сервера hangfire в мой метод startup.cs ConfigureServices вместе с app.UseHangfireDashboard в моем методе Configure.

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

 var id = client.Schedule(() => Repository.MyJob(), TimeSpan.FromMinutes(1));
 

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

Я также заметил, просматривая серверы на панели мониторинга, что Hangfire продолжает создавать «дополнительные» или «старые» серверы вместе с новым сервером.

Я считаю, хотя и не уверен на 100%, что эти старые серверы являются причиной выполнения старого кода. Я написал следующий код в моем Startup.cs, чтобы избавиться от любых существующих серверов, как только Hanfire будет инициализирован:

     IMonitoringApi monitoringApi = JobStorage.Current.GetMonitoringApi();
    foreach (var s in monitoringApi.Servers())
    {
        JobStorage.Current.GetConnection().RemoveServer(s.Name);
    }
 

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

Я использую хранилище SQL в своих настройках Hangfire, и я удалил все таблицы Hangfire в своей базе данных перед выполнением моего приложения, что позволяет Hanfire воссоздавать их при повторном добавлении. Я также удалил все ссылки на Hanfire, удалив пакет Hanfire из своего приложения и перестроив свой код. Я также очистил файлы кэша Chrome. Я в основном перепробовал все, что смог найти в своем поиске Google по этой проблеме, но мне не удалось избавиться от старых серверов или остановить Hanfire от выполнения старого кода.

Я знаю, что я не могу быть единственным разработчиком, столкнувшимся с этой проблемой. Кто-нибудь нашел решение этой проблемы? Есть ли решение? Как я могу избавиться от этих старых серверов и помешать Hanfire выполнять старый код?

Я был бы очень признателен за любую помощь. Спасибо!

Комментарии:

1. Перед запуском убедитесь, что вы перестроили свой код. Также, если задание не завершается, оно автоматически повторяет задание. Что касается того, почему серверы sre отображаются с использованием кода api во второй части вашего вопроса, то это потому, что hangfire использует механизм опроса для отслеживания количества серверов. Поэтому, если сервер выходит из строя, может потребоваться некоторое время, чтобы он появился.

2. Как Hangfire может повторить задание, которое не существует, когда я обрезал / удалил все таблицы Hangfire из базы данных? Хранит ли он отдельную запись заданий где-то еще? У меня тот же вопрос относительно серверов. Если все таблицы Hangfire удалены из базы данных, включая Hangfire. Сервер, как они продолжают возвращаться? Кроме того, я перестраиваю свой проект каждый раз, когда я его выполняю.

3. Единственное, что я смог найти, — это эта статья. обсудить. hangfire.io/t/datacontext-old/2924

Ответ №1:

Итак, вот что я сделал не так, что привело к тому, что я получил «призрачные» серверы в Hangfire. По сути, у меня было запущено два экземпляра моего приложения, и я даже не осознавал этого. Я развернул свое приложение на нашем ТЕСТОВОМ сервере в Azure, который использовал базу данных Azure. Это тестовое приложение также было настроено на «всегда запускаться». Теперь, когда я тестировал свои изменения в приложении на своей машине разработки, я также подключался к той же базе данных Azure, к которой было подключено тестовое приложение. Вот почему, даже когда я урезал таблицы Hangfire, «призрачные» серверы продолжали возвращаться. Эти серверы принадлежали приложению, которое работало на ТЕСТОВОМ сервере, и поскольку приложение всегда работало, серверы продолжали воссоздаваться, а старый код на ТЕСТОВОМ сервере продолжал выполняться, поскольку я никогда не развертывал изменения со своего сервера разработки на ТЕСТОВОМ сервере в Azure.

По сути, это была моя собственная глупая ошибка.