C# - 当站点上没有 activity 时,Quartz 调度程序停止 运行

C# - Quartz scheduler stopped running when no activity on the site

我已经使用 quartz 调度程序创建了 asp.net 站点。该作业在后台 运行,站点上没有其他 activity。

Quartz 调度器每 30 分钟调度一次。

IIS 启动后,Scheduler 运行 正确。

但一段时间后,Scheduler 停止了 运行(大约 1 小时)。

如果站点上有一个或多个 activity 作为用户登录或查看仪表板,则调度程序会正确运行。

但是当站点上没有 activity 时它会停止 运行。

当现场没有 activity 时,如何让我的调度程序始终保持活动状态?

P/s:我知道我的问题可能与其他问题重复。但我还是问了,因为我不能评论问其他问题的答案。

编辑:

Day Running at: 7/14/2016 4:00:00 AM
--
Day Running at: 7/14/2016 4:30:00 AM
--
Day Running at: 7/14/2016 5:00:00 AM
--
Stopped running
--
Day Running at: 7/14/2016 2:00:00 PM
--
Day Running at: 7/14/2016 2:30:00 PM
--
Day Running at: 7/14/2016 3:00:00 PM
--
Stopped running
--

默认情况下,如果应用程序在一段时间内没有收到请求,IIS 将卸载您的应用程序。

您可以将 IIS 配置为永不卸载您的 application.There IIS 将卸载您的应用程序的原因有很多 - 请确保禁用所有这些。它在应用程序池设置中,最好转到高级设置并仔细通过所有设置。

附带说明一下,如果您有后台作业需要可靠地 运行 按时完成,为什么不将其部署在 Windows 服务中,而不是 Web 应用程序? Web 应用程序最擅长处理传入请求,而不是 运行 计划作业。

更新

在应用程序池的高级设置中查看这些:

  • 进程模型/空闲超时和空闲超时操作
  • 回收/定期时间间隔、请求限制、私有内存限制、虚拟内存限制

通常 you shouldn't use ASP.NET for recurring tasks 因为它不是为此而构建的,建议为此使用 Windows 服务。

但是,您可以使用 WebBackgrounder. Scott Hanselman seems to endorse it ;) 他还演示了如何使用 Quartz.NET。


或者您可以启动一个线程,每分钟从您的应用程序向自身生成请求,以保持它:

    protected void Application_Start()
    {
        // ...

        ThreadPool.QueueUserWorkItem(o => PingMyself());
    }

    private static void PingMyself()
    {
        var webClient = new WebClient();
        while (true)
        {
            Thread.Sleep(TimeSpan.FromMinutes(1));
            webClient.DownloadString("http://my.public.address.com");
        }
    }