C# Quartz.NET在随机持续时间后停止触发

C# Quartz.NET在随机持续时间后停止触发,c#,cron,scheduler,quartz.net,C#,Cron,Scheduler,Quartz.net,我让Quartz.NET调度程序(在Windows服务中)每15分钟运行一次,使用cron表达式0 0/15***? 它在任意时间段运行良好,通常超过2天,但不超过5天 我的log4net记录器被配置为在每次触发调度程序时追加一行,这就是我知道它已停止的方式 我已检查Windows事件查看器是否存在任何未处理的异常,但未发现任何异常。Quartz.net有没有办法找出内部的错误?我有一个类似的场景,运行了几个月都没有问题,所以我不知道您的场景中出现了什么错误。但是,Quartz.NET使用我在应

我让Quartz.NET调度程序(在Windows服务中)每15分钟运行一次,使用cron表达式
0 0/15***?

它在任意时间段运行良好,通常超过2天,但不超过5天

我的log4net记录器被配置为在每次触发调度程序时追加一行,这就是我知道它已停止的方式


我已检查Windows事件查看器是否存在任何未处理的异常,但未发现任何异常。Quartz.net有没有办法找出内部的错误?

我有一个类似的场景,运行了几个月都没有问题,所以我不知道您的场景中出现了什么错误。但是,Quartz.NET使用我在应用程序中配置的常见日志记录,因此我可以为您提供相关的配置部分,以便您可以为Quartz.NET配置日志记录

第一:所需的配置部分:

<configSections>
  <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <sectionGroup name="common">
    <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
  </sectionGroup>
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  ...
</configSections>

...
第二:我的Quartz.NET配置。我的作业存储是SQL Server

<quartz>
  <add key="quartz.scheduler.instanceName" value="QuartzScheduler" />
  <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
  <add key="quartz.threadPool.threadCount" value="3" />
  <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
  <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" />
  <add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
  <add key="quartz.jobStore.useProperties" value="true" />
  <add key="quartz.jobStore.dataSource" value="myDS" />
  <add key="quartz.dataSource.myDS.connectionString" value="Data Source=.;Initial Catalog=Development;Integrated Security=True" />
  <add key="quartz.dataSource.myDS.provider" value="SqlServer-20" />
</quartz>

最后是日志记录配置:

<common>
  <logging>
    <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net">
      <arg key="configType" value="INLINE" />
    </factoryAdapter>
  </logging>
</common>
<log4net>
  <appender name="RootAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\Log\Service.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value=" dd-MM-yyyy" />
    <maxSizeRollBackups value="30" />
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="All" />
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss,fff} %-5level %property{UsnSearchKey} (%logger) %message%newline%exception" />
    </layout>
  </appender>
  <root>
    <appender-ref ref="RootAppender" />
  </root>
  <!-- Specify minimum logging level for Quartz logger. -->
  <logger name="Quartz">
    <level value="DEBUG" />
  </logger>
</log4net>


此配置应在
c:\log
目录中创建一个
Service.log
文件,该目录包含Quartz.NET的调试日志语句。

您的回答确实帮助了我。然而,为了解决这个问题,我正在尝试一种不同的方法,我认为应该解决它。早些时候,我为我拥有的3个不同的
作业
实例化了不同的
调度程序
对象,这些对象的作用域是一个方法。现在我有了一个静态
调度程序
对象,通过它我可以运行所有这3个作业。我认为GC在一段时间后取消分配了所有
调度程序
对象。这可能是原因吗?也许是可能的,但由于时间的原因,可能性不大。如果这确实是问题所在,我希望这些调度程序能够在2到5天内被垃圾收集。静态计划程序绑定到AppDomain,因此它不符合垃圾收集的条件。我希望这能解决你的问题。