如何解决为什么 Quartz .NET 3.0.7 调度程序挂起 DB 不可用错误
我在 C# 控制台应用程序(作为 Windows 服务运行)中遇到了一个非常简单的非集群石英服务器的问题。它包括一个调度程序,它读取和写入单个数据库,这意味着同一组“qrtz_*”表。 偶尔,主要是在周末晚上,当我工作的公司执行数据库备份和一般维护时,我设置的调度程序侦听器会抛出
QuartzSchedulerListener
Scheduler Error -> MESSAGE: An error occurred while scanning for the next trigger to fire.
Couldn't acquire next trigger: Fatal error encountered during command execution.
at Quartz.Impl.AdoJobStore.JobStoreSupport.d__229.MoveNext() in C:\projects\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 2688 --- End of stack trace from prevIoUs location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Quartz.Impl.AdoJobStore.JobStoreSupport.d__262`1.MoveNext() in C:\projects\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 3816 --- End of stack trace from prevIoUs location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptiondispatchInfo.Throw() at Quartz.Impl.AdoJobStore.JobStoreSupport.d__262`1.MoveNext() in C:\projects\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 3831 --- End of stack trace from prevIoUs location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Quartz.Impl.AdoJobStore.JobStoreSupport.d__228.MoveNext() in C:\projects\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 2542 --- End of stack trace from prevIoUs location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at Quartz.Core.QuartzSchedulerThread.d__28.MoveNext() in C:\projects\quartznet\src\Quartz\Core\QuartzSchedulerThread.cs:line 262
我假设由于数据库暂时不可用。
然后,有时,它只是挂起并停止执行任何触发器 - 它不会更新触发器的 NEXT_FIRE_TIME,我只能重新启动控制台应用程序(重新配置调度程序并重新启动它)。
我尝试在调度程序配置连接字符串中增加 dbCOMmandTimeout,但它看起来好像陷入了某种死锁。
PS:我有一个类似的设置,一组从几个数据库读取/写入的石英 2.6.1 调度程序。他们在数据库维护方面遇到了同样的错误,但在一年多的活动中他们从未停止过。
我的想法已经用完了,请让我知道是否有人遇到过这种情况。
谢谢
解决方法
我们在 Quartz 版本 https://github.com/quartznet/quartznet/blob/main/changelog.md
我认为你必须将 Quartz 更新到至少 3.1,其中一些关于数据库不可用的死锁问题已得到修复:
还有一个非常重要的错误修复,用于重试锁定处理。在某些情况下,数据库锁处理可能会出现死锁。
希望它能帮助我,因为它帮助了我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。