【问题标题】:Quartz.NET stops triggering after random durationsQuartz.NET 在随机持续时间后停止触发
【发布时间】:2014-07-11 18:13:48
【问题描述】:

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

随机运行一段时间,通常超过 2 天,不超过 5 天。

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

我检查了 Windows 事件查看器是否有任何未处理的异常,但什么也没找到。 Quartz.net 有什么办法可以找出里面出了什么问题?

【问题讨论】:

    标签: c# cron scheduler quartz.net


    【解决方案1】:

    我有一个类似的场景,运行了几个月都没有问题,所以我不知道你的场景出了什么问题。但是,Quartz.NET 使用我在应用程序中配置的 Common Logging,因此我可以为您提供我的相关配置部分,以便您可以为 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 个不同的 Jobs 实例化了不同的 Scheduler 对象,并且这些对象被限定为一个方法。现在我有一个静态 Scheduler 对象,通过它我运行所有这 3 个作业。我认为 GC 会在一段时间后释放所有 Scheduler 对象。会不会是这个原因?
    • 有可能,但不太可能,因为时间关系。如果这确实是问题,我预计这些调度程序将在 2 到 5 天之前被垃圾收集。静态调度程序与您的 AppDomain 相关联,因此它不会有资格进行垃圾收集。我希望这能解决您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2015-07-10
    • 2016-07-12
    • 1970-01-01
    相关资源
    最近更新 更多