【问题标题】:Cron Job (Quartz.NET) in .NET is not triggering daily.NET 中的 Cron Job (Quartz.NET) 不会每天触发
【发布时间】:2017-02-27 08:24:54
【问题描述】:

我已经在 .NET 中安排了一个 cron 作业,并且它托管在 IIS 中。在它触发的第一天(出于测试目的,我实际上是在触发此作业时发送邮件)。但是第二天它没有(我希望这每天递归......每 24 小时一次)请在下面找到代码。[![在此处输入图像描述][1]][1]

public class JobScheduler
{
    public static void Start()
    {
        try
        {
            Logger.Error("-------------------------------------------Inside JobScheduler Start-------------------------------------------");

            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();

            IJobDetail job = JobBuilder.Create<QualityGateSFDCActionJob>().Build();

            ITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger3", "group1").WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 42)).ForJob(job).Build();

            scheduler.ScheduleJob(job, trigger);

            Logger.Error("-------------------------------------------Scheduler Started without Issues-------------------------------------------");
        }
        catch (Exception ex)
        {
            Logger.Error(ex.Message);
            throw ex;
        }
    }
}

对此有一些好心的帮助。

ITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger3", "group1").WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 42)).ForJob(job).Build();

我只想让这项工作在每天上午 11:42 运行。我将非常感谢您在这方面的任何帮助

应用程序基于 ASP.NET MVC 构建并托管在 IIS 上。我希望每天运行一个作业,这就是我选择 Cron Job 的原因(Windows 服务在我的生产服务器中超出了上下文/范围)

【问题讨论】:

  • 我认为这与 IIS 有关,因为它会在一段时间后回收应用程序池,并且您的工作将不再触发。你为此使用静态类吗?长时间运行的任务不应该在IIS中多运行在外部服务左右
  • 我同意 Jehof 的观点,可能与 IIS 回收有关。你什么时候调用这个 Start() 方法?它是否需要您手动执行某些操作,即。调用服务?
  • 感谢 Jehof & CathalMF 的快速回复。是的,我们将调用服务(REST API)来发布数据。它应该每天发生

标签: c# quartz.net


【解决方案1】:

IIS 有一个称为“回收”的功能。这基本上会重新加载 IIS 中的所有内容。

如果您在 IIS 管理器中进入应用程序池的高级设置,则会有一个回收间隔,默认为 1740 分钟(29 小时)

当 IIS 回收时,您的应用程序将不会开始运行,直到调用 web 服务。因此,它每 29 小时会回收一次,因此取决于您启动 Web 服务的时间,它将运行您的 Cron 作业一次或两次,但绝不会运行第三次,除非您在回收后调用您的 Web 服务以重新启动它。

基本上,IIS 不是托管需要始终运行作业的应用程序的好地方。

【讨论】:

  • IIS 应用程序池回收还有其他原因,例如快速故障保护(在可配置数量的未处理异常之后)或在可配置数量的请求后回收......以使其可靠,定时器当然应该托管在一个专门的服务进程中。
  • 感谢 CathalMF 的回复。所以,你的意思是说 CRON Job 在 IIS 上这样做不是一个好主意???我选择了这个,因为我没有权限/权限(Windows 服务,或我的生产服务器上的 sql 作业)。请建议
  • 是 IIS8 吗?然后使用应用程序初始化,您可能能够在回收后执行初始化代码,从而“复活”您的计时器:weblog.west-wind.com/posts/2013/oct/02/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多