1

正如标题所说,我根本无法让 Quartz.NET 工作。我从 NuGet 获得了最新版本的 Quartz.NET (2.2.1)、common.logging (2.1.2)、common.logging.nlog (2.0.0) 和 NLog (2.1.0)。触发器没有触发,Quartz 绝对没有记录任何内容。我猜我以某种方式搞砸了配置。

我的 App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <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>

  </configSections>

  <common>
    <logging>
      <factoryAdapter type="Common.Logging.NLog.NLogLoggerFactoryAdapter, Common.Logging.NLog">
        <arg key="configType" value="FILE" />
        <arg key="configFile" value="~/NLog.config" />
      </factoryAdapter>
    </logging>
  </common>

  <quartz>
    <add key="quartz.scheduler.instanceName" value="ServerScheduler" />

    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
    <add key="quartz.threadPool.threadCount" value="10" />
    <add key="quartz.threadPool.threadPriority" value="2" />

    <add key="quartz.jobStore.misfireThreshold" value="60000" />
    <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
  </quartz>

...

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
...
      <dependentAssembly>
        <assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Common.Logging" publicKeyToken="af08829b84f0328e" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.1.2.0" newVersion="2.1.2.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

有一项工作和一个与之相关的触发器:

{Trigger 'DEFAULT.DailyYahooUpdateTrigger':  triggerClass: 'Quartz.Impl.Triggers.CronTriggerImpl calendar: '' misfireInstruction: 0 nextFireTime: 01/29/2014 18:38:00 +00:00}
    [Quartz.Impl.Triggers.CronTriggerImpl]: {Trigger 'DEFAULT.DailyYahooUpdateTrigger':  triggerClass: 'Quartz.Impl.Triggers.CronTriggerImpl calendar: '' misfireInstruction: 0 nextFireTime: 01/29/2014 18:38:00 +00:00}
    CalendarName: null
    Description: null
    EndTimeUtc: null
    FinalFireTimeUtc: null
    HasMillisecondPrecision: false
    JobDataMap: {Quartz.JobDataMap}
    JobKey: {DEFAULT.DailyYahooUpdate}
    Key: {DEFAULT.DailyYahooUpdateTrigger}
    MisfireInstruction: 0
    Priority: 5
    StartTimeUtc: {29/1/2014 18:37:44 +00:00}

调度程序已启动,作业和触发器已正确添加,否则日志记录工作。nextFireTime 来来去去,什么都没有发生。

触发器创建代码:

    ITrigger trigger = TriggerBuilder
        .Create()
        .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(jobDetails.Time.Hours, jobDetails.Time.Minutes))
        .StartNow()
        .WithIdentity(jobDetails.Name + "Trigger")
        .Build();
4

2 回答 2

0

我已经复制了您的问题,这对我有用:

ITrigger trigger = TriggerBuilder
    .Create()
    .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(jobDetails.Time.Hours, jobDetails.Time.Minutes))
    .WithIdentity(jobDetails.Name + "Trigger")
    .Build();

取下.StartNow(),触发器应该会触发。

希望能帮助到你!

于 2014-01-30T13:25:20.127 回答
0

根据您的信息,它应该可以工作;它应该每天运行一次。

确保您已安装 Common Logging NLog20]:

Install-Package Common.Logging.NLog20

并更改此部分:

  <common>
    <logging>
      <factoryAdapter type="Common.Logging.NLog.NLogLoggerFactoryAdapter, Common.Logging.NLog20">
        <arg key="configType" value="FILE" />
        <arg key="configFile" value="~/NLog.config" />
      </factoryAdapter>
    </logging>
  </common>

这应该是您的运行时部分:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

您可以使用以下命令检查触发器的时间表:

private static void GetNext10FireTimes(ITrigger trigger)
{
    Console.WriteLine("List of next 10 schedules: ");

    var dt = trigger.GetNextFireTimeUtc();

    for (int i = 0; i < 10; i++)
    {
    if (dt == null)
        break;

    Console.WriteLine(dt.Value.ToLocalTime());

    dt = trigger.GetFireTimeAfter(dt);
    }
}

可以在此处找到完整的工作示例( QuartzNetDailyAtHourAndMinute.zip )。

于 2014-01-30T13:40:04.793 回答