Hangfire 没有找到应用程序文件,即使它有心跳

Hangfire does not find the app files eventhough it gets heartbeat

Hangfire 没有找到或解析项目程序集 - 所有的 - 尽管它有心跳。

不确定是什么原因造成的,但仪表板还显示该应用程序每三分钟重新启动一次,这是不可能的,因为我们在一个有数百人同时使用的应用程序上使用了负载均衡器。如此多的冷启动意味着用户会抱怨的极长的加载时间。

这是 recurring jobs 选项卡上显示的错误;

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.IO.FileNotFoundException: Could not resolve assembly 'My.Api'.
   at System.TypeNameParser.ResolveAssembly(String asmName, Func`2 assemblyResolver, Boolean throwOnError, 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 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)

事实证明,当多个应用程序使用相同的 sql schema 时,Hangfire 本身并不能正常工作。为了解决这个问题,我使用了 Hangfire.MAMQSqlExtension。它是一个第三方扩展,但 repo 说它被 Hangfire 官方认可。 如果您对多个应用程序使用相同的 schema,则您 必须 在所有应用程序中使用此扩展程序。

如果您的应用同时具有不同的版本(例如 productiontestdevelopment) 此应用程序本身不能完全处理 失败的作业 。如果作业失败,常规 Hangfire 将不会遵守其原始队列,因此会将其移至 default 队列。如果您的应用仅适用于您应用的队列或共享默认队列,这最终会产生问题。为了解决这个问题,强制 Hangfire 尊重原始队列属性,我使用了 this 解决方案。效果很好,您可以根据 web.configappsettings.json.

命名您的应用队列