Hangfire - 无法安排重复作业,请参阅内部异常了解详细信息

2023-12-27

我有一个应用程序;它位于三个不同的服务器上,使用负载均衡器进行用户分配。 该应用程序使用自己的队列,我为作业添加了一个过滤器以保留其original排队以防它们在某个时候失败。但话又说回来,它仍然表现得就像应用程序没有运行一样。错误如下;

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)
What can be the issue here? The apps are running. And once I trigger the recurring jobs, they are good to go, until they show the above error.

这是我的 AppStart 文件;

private IEnumerable<IDisposable> GetHangfireServers()
{
    Hangfire.GlobalConfiguration.Configuration
        .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
        .UseSimpleAssemblyNameTypeSerializer()
        .UseRecommendedSerializerSettings()
        .UseSqlServerStorage(HangfireServer, new SqlServerStorageOptions
        {
            CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
            SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
            QueuePollInterval = TimeSpan.Zero,
            UseRecommendedIsolationLevel = true,
            DisableGlobalLocks = true
        });

    yield return new BackgroundJobServer(new BackgroundJobServerOptions {
        Queues = new[] { "myapp" + GetEnvironmentName() },
        ServerName = "MyApp" + ConfigurationHelper.GetAppSetting("Environment")
    });
}

public void Configuration(IAppBuilder app)
{
    var container = new Container();
    container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
    
    RegisterTaskDependencies(container);
    container.RegisterWebApiControllers(System.Web.Http.GlobalConfiguration.Configuration);
    container.Verify();
    
    var configuration = new HttpConfiguration();
    configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
    
    /* HANGFIRE CONFIGURATION */
    if (Environment == "Production")
    {
        GlobalJobFilters.Filters.Add(new PreserveOriginalQueueAttribute());
        Hangfire.GlobalConfiguration.Configuration.UseActivator(new SimpleInjectorJobActivator(container));
        Hangfire.GlobalConfiguration.Configuration.UseLogProvider(new Api.HangfireArea.Helpers.CustomLogProvider(container.GetInstance<Core.Modules.LogModule>()));
        app.UseHangfireAspNet(GetHangfireServers);
        app.UseHangfireDashboard("/hangfire", new DashboardOptions
        {
            Authorization = new[] { new DashboardAuthorization() },
            AppPath = GetBackToSiteURL(),
            DisplayStorageConnectionString = false
        });
        AddOrUpdateJobs();
    }
    /* HANGFIRE CONFIGURATION */
    
    app.UseWebApi(configuration);
    
    WebApiConfig.Register(configuration);

}

public static void AddOrUpdateJobs()
{
    var queueName = "myapp" + GetEnvironmentName();
    RecurringJob.AddOrUpdate<HangfireArea.BackgroundJobs.AttachmentCreator>(
         "MyApp_MyTask",
         (service) => service.RunMyTask(), 
      "* * * * *", queue: queueName, timeZone: TimeZoneInfo.FindSystemTimeZoneById("Turkey Standard Time"));
}

这里可能有什么问题?


事实证明,当多个应用程序使用同一个应用程序时,Hangfire 本身并不能很好地工作sql schema。为了解决这个问题我使用了Hangfire.MAMQSql扩展 https://github.com/GeXiaoguo/Hangfire.MAMQSqlExtension。它是一个第三方扩展,但存储库表示它得到了 Hangfire 的正式认可。 如果您对多个应用程序使用相同的架构,则have to使用这个扩展all您的应用程序,否则您将面临上述错误。

如果您的应用程序同时存在不同版本(例如生产, test, 发展)这个应用程序本身并不完全适用于失败的工作。如果作业失败,常规 Hangfire 将不会尊重其原始队列,因此会将其移动到default队列。如果您的应用程序仅适用于应用程序的队列,或者如果default队列是共享的。为了解决这个问题,为了强制 Hangfire 尊重原始队列属性,我使用了this https://github.com/HangfireIO/Hangfire/pull/502#issuecomment-176744750解决方案。效果很好,您可以根据您的需要来命名应用程序的队列web.config or appsettings.json.

我之前的回答不知为何被删除了?这样问题就解决了,没有其他办法了。对于遇到此问题的人,请勿删除答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hangfire - 无法安排重复作业,请参阅内部异常了解详细信息 的相关文章

随机推荐

  • Python浮点舍入错误[重复]

    这个问题在这里已经有答案了 使用列表理解表达式时 x 0 1 for x in range 0 5 我希望得到这样的列表 0 0 0 1 0 2 0 3 0 4 然而我却得到了这个 0 0 0 1 0 2 0 300000000000000
  • 如何接收流式传输的 HTTP 响应

    当使用 Go 抛出 HTTP 请求并接收响应时 考虑到 ResponseBody 很大 1 GB 或更多 的情况 我希望在流式传输时接收响应 resp err http Client Do req 在这种情况下 如果正文很大 我无法读取标题
  • 可可应用程序的卸载程序

    我使用 PackageMaker 作为我的应用程序的安装程序 这不仅仅是一个简单的捆绑包 我想知道如何创建卸载程序 在哪里安装它以及如何向用户提供启动它的方式 在此先感谢您的帮助 在为某些 MAC 操作系统应用程序实现卸载程序时 我们想到了
  • 如何管理 Feign 错误?

    我们正在使用弹簧启动 with 春云 and Spring cloud Netflix with Spring cloud feign 我们正在创建我们的网关应用程序 它的帮助是Feign将尝试与我们沟通authentication微服务以
  • JSON 到 Java 类

    有没有一种简单的方法可以通过 android API 将数据从 JSON 映射到我的类的字段 JSON email email password pass 我的课 class Credentials string email string
  • 了解自适应龙格库塔积分器的局部截断误差

    我正在实现一个 RKF4 5 积分器 我无法确定我的代码是否正常工作 并且我不明白本地截断错误 或者我的代码是否无法正常工作 对于代码块的大小 我深表歉意 但在这种情况下 最小可重现示例相当大 import numpy as np def
  • C++ GDI+ 如何绘制带边框半径的矩形

    这就是我使用 GDI 绘制矩形的方法 Graphics g hdc SolidBrush blueColor Color 255 74 134 232 g FillRectangle blueColor x y width height D
  • 如何知道应用程序是否被用户或 iOS 终止(后台 10 分钟后)

    重启应用程序时如何知道应用程序是被用户终止还是被iOS终止 gt 按用户 是指 通过双击主页按钮并按 按钮 被用户杀死 通过 iOS 意味着 应用程序进入后台运行状态 iOS 在 10 分钟后终止应用程序 如果您的应用程序处于暂停状态app
  • 添加矩阵的倍数,无需构建新矩阵

    假设我有两个矩阵B and M我想执行以下语句 B 3 M 我重复执行这条指令 所以我不想每次都构建矩阵3 M 3可能会改变 这只是为了表明我只做标量矩阵乘积 它是一个 numpy 函数 使这个计算 就位 吗 更准确地说 我有一个标量列表a
  • ant 错误“命令的语法不正确。”运行 ant.bat

    我尝试了各种 ant 版本 也尝试直接从 ant home bin 目录运行命令 但没有成功 仅出现以下错误 ant 错误 命令的语法不正确 运行 ant bat 请对此提供帮助 我在网络上找不到任何有用的信息 Thanks 幸运的是我找到
  • PayPal 沙盒帐户空白

    我通过 PayPal 沙箱创建的帐户 创建于http developer paypal com http developer paypal com 创建时余额为零 并且没有信用卡 无论我在创建帐户时设置什么 这导致 在付款页面上 要求我输入
  • 有没有办法找出 NSManagedObjectContext 所在的线程?

    我对线程的理解NSManagedObjectContext是它只能在创建它的线程上执行核心数据获取请求 删除等 有什么方法可以检查哪些线程NSManagedObjectContext创建于 或者如果在特定的执行点当前线程是特定的线程NSMa
  • Response.Write Base64 字符串

    我收到一个 Base64 字符串 它实际上是 PDF 文件的字符串表示形式 我想用 Response Write 写入此字符串 但不将其转换回其二进制表示形式 我试过这个 var base64string Response Write ba
  • 在 Flex 中实现定时器循环是一个坏主意吗?

    在我们的游戏项目中 我们确实将计时器循环设置为每秒触发约 20 次 与应用程序帧速率相同 我们用它来移动一些精灵 我想知道这是否会导致问题 我们应该使用 EnterFrame 事件处理程序进行更新 我的印象是 定时器循环运行得比应用程序帧速
  • Eclipse:将静态方法调用转换为静态导入

    有没有办法自动转换这个静态方法调用 Arrays asList import java util Arrays import java util List public class StaticImport public static vo
  • 如何在 iPhone 中绘制饼图

    我想在我的应用程序中绘制一个饼图 有谁知道任何代码或教程来帮助我 我在下面的链接中找到了一些http rajeev name blog 2009 01 18 drawing pie charts using iphone sdk http
  • 如何为不同数据库中的登录名授予访问 SQL Server 数据库邮件程序的权限?

    我想知道如何在 SQL Server 中设置权限 以允许我的应用程序登录 角色能够使用发送电子邮件msdb dbo sp send dbmail 我有一个数据库MyDb 一个用户MyUser谁是角色的成员AppRole 我有一个存储过程my
  • 如何将套接字重置回阻塞模式(在将其设置为非阻塞模式之后)?

    我已经阅读了有关将套接字设置为非阻塞模式的内容 http www gnu org software libc manual html mono libc html File Status Flags http www gnu org sof
  • 验证 10 个字符,只能是数字,然后重定向到网址

    所以我需要发生什么 用户输入 10 位数字 仅限数字 并单击 提交 提交后 用户被重定向到另一个登陆页面 这是我所做的 及其重定向 但没有真正验证这 10 个字符 或者它们是数字 我有另一个脚本可以做到这一点 但不能同时使用 因为它们使用不
  • Hangfire - 无法安排重复作业,请参阅内部异常了解详细信息

    我有一个应用程序 它位于三个不同的服务器上 使用负载均衡器进行用户分配 该应用程序使用自己的队列 我为作业添加了一个过滤器以保留其original排队以防它们在某个时候失败 但话又说回来 它仍然表现得就像应用程序没有运行一样 错误如下 Sy