Этот вопрос может показаться довольно глупым, так что извините за это. Я новичок в Hangfire.
Я использую Hangfire (с MongoDB) в своем основном приложении .net, и все в порядке!
Но вчера я получил следующие ошибки для моих повторяющихся заданий.
System.InvalidOperationException:
Recurring job can't be scheduled, see inner exception for details.
---> Hangfire.Common.JobLoadException: Could not load the job. See inner exception for the details.
---> System.TypeLoadException:
Could not load type 'AirQualityControl.Core.Models.Domain.AirMonitoringStation' from assembly 'AirQualityControl.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. at System.Reflection.RuntimeAssembly.GetType(QCallAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type, ObjectHandleOnStack keepAlive, ObjectHandleOnStack assemblyLoadContext) at System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase) at System.TypeNameParser.ResolveType(Assembly assembly, String[] names, Func`4 typeResolver, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark) at System.TypeNameParser.ConstructType(Func`2 assemblyResolver, Func`4 typeResolver, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark) at System.TypeNameParser.GetType(String typeName, Func`2 assemblyResolver, Func`4 typeResolver, Boolean throwOnError, Boolean ignoreCase, StackCrawlMark& stackMark) at System.Type.GetType(String typeName, Func`2 assemblyResolver, Func`4 typeResolver, Boolean throwOnError) at Hangfire.Common.TypeHelper.DefaultTypeResolver(String typeName) at System.Linq.Enumerable.SelectArrayIterator`2.ToArray() at Hangfire.Storage.InvocationData.DeserializeJob() --- End of inner exception stack trace --- at Hangfire.Storage.InvocationData.DeserializeJob() at Hangfire.RecurringJobEntity..ctor(String recurringJobId, IDictionary`2 recurringJob, ITimeZoneResolver timeZoneResolver, DateTime now) --- End of inner exception stack trace --- at Hangfire.Server.RecurringJobScheduler.ScheduleRecurringJob(BackgroundProcessContext context, IStorageConnection connection, String recurringJobId, RecurringJobEntity recurringJob, DateTime now)
enter code here
Это полностью моя вина 🤦♀️ , потому что я случайно изменил пространство имен типа. Я возвращаю эти изменения в предыдущее состояние.
Но меня беспокоит текущее состояние рабочих мест:
Как вы можете видеть, следующее выполнение пусто.
Обычно он содержит дату и время, когда задание будет запущено в следующий раз.
Я так предполагаю, что они не будут обедать по выражению CRON?
Нужно ли как-то вручную настраивать эти задания?
Или они снова будут работать сегодня в 19:00 по выражению CRON?
Большое спасибо за вашу помощь и хорошего дня!
@NikhilPatil Я не отменяю этот параметр. Поэтому я полагаю, что у него есть значение по умолчанию, равное 10, согласно исходному коду. github.com/HangfireIO/Hangfire/blob/master/src/Hangfire.Core/…
Я не уверен, почему следующее время выполнения пусто, потому что ваша работа не удалась только 5 раз. Откуда вы получаете следующее время выполнения? Я не вижу ни одного поля в БД, в котором хранится это значение. У вас есть доступ к панели управления hangfire
? Может там проверишь?
@NikhilPatil Я обновил вопрос, добавив более подробную информацию, если быть точнее. Надеюсь, вы найдете это полезным
Вверх. все еще есть такая же проблема
@CherryBlossom, я опубликовал ответ, который пытается подробно описать ответ. Надеюсь, вы найдете это полезным
Обновление: для тех, кто не знаком с Hangfire и сталкивается с той же проблемой.
Каждое задание в Hangfire имеет определенное количество повторных попыток. Это может быть глобальный параметр или его можно изменить с помощью атрибута AutomaticRetry для каждого задания.
По умолчанию каждое задание имеет 10 повторных попыток.
Если количество повторных попыток превысило максимальное количество, задание будет перемещено в Неудачное состояние (с сообщением журнала ошибок), и вы сможете повторите попытку вручную.
Кроме того, важно отметить, что мы можем увидеть Hangfire с его работой в качестве конечного автомата.
Это изображение имеет только иллюстративную цель. Это не точный список состояний задания Hangfire.
Это означает, что каждая работа должна иметь определенное состояние. Некоторые из них терминальные, а некоторые нет.
Здесь вы можете найти полный список состояний заданий Hangfire.
Согласно документации
Сбой — определяет промежуточное состояние фонового задания, когда его обработка была прервана исключительным случаем, и это проблема разработчика. Ответственность за решение, что делать с ним дальше.
Это означает, что задание не будет запускаться автоматически, и вам следует запустить его вручную или избавиться от него.
Какова конфигурация максимального количества повторных попыток в
hangfire
до того, как задание будет установлено как неудачное?