如何保持quartz .net的调度程序存活?

时间:2014-05-04 05:20:44

标签: c# asp.net quartz.net quartz.net-2.0

我在我的asp网站上使用quartz,我在application_start方法中初始化调度程序并在application_end方法中关闭,我的触发器每天都会触发但我发现如果没有请求,我的调度程序会自动关闭,所以我的背景工作将不会被触发,有没有更好的方法来保持调度程序的生命周期,只有在服务器停止时关闭?

5 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

通常,如果您需要可靠的计划,则不应在网站内进行。

如您所见,工作流程将在一段时间后关闭。即使您强制工作进程一直运行,也有可能导致它终止的条件。这不是一个好主意。

相反,您应该编写一个Windows服务并运行quartz.net。

如果您无法安装服务(假设您处于共享托管环境中),那么您的选项会受到更多限制。

答案 2 :(得分:0)

我想知道同样的事情。最终,虽然我同意普遍的共识,但我想看看它是如何完成的,因为我自己也遇到过类似的情况,我无法使用Windows服务。

我所做的只是创建一个新作业,在执行时会向应用程序本身发送HTTP请求。对我来说,我把它指向一个只包含@Datetime.Now.ToString()的页面。

向自身发送HTTP请求的操作应足以使调度程序(和父工作进程)保持活动状态。

但是停止应用程序停止/回收而不发出警告。如果你想要一种方法来处理它,那么你可能需要运行多个站点来ping自己和另一个站点。这样一来,如果一个站点发生故障,另一个站点可以点击它(假设已经启动)将其恢复。

答案 3 :(得分:0)

有一个IIS配置允许工作进程一直保持开启状态。我通过另一个SO回答link找到了此设置。

编辑C:\ Windows \ System32 \ inetsrv \ config \ applicationHost.config以包含:

<applicationPools> 
    <add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" /> 
</applicationPools>

Scott Guthrie(微软.NET产品经理)回答了与OP问题直接相关的问题(link)。

  

@Dominic Pettifer,

     
    

如果我设置startMode =“AlwaysRunning”这是否意味着网络应用程序将     '永远'关闭,永远都会继续运行,即使没有     交通堵塞了很长一段时间(除非当然是这样)     手动关闭,或服务器关闭/崩溃等)?该     我问的原因是因为我喜欢运行后台线程/服务     IIS ASPNET工作进程而不是使用Windows服务(我们     处理在服务器上有很多安全限制的客户     这使得运行Windows服务变得困难或不可能)。     通常情况下,我必须定期设计一些可以访问网站的内容     保持ASPNET工作进程处于活动状态并阻止其关闭     下。

  
     

这应该意味着应用程序和工作进程始终是   运行 - 所以我认为这确实可以很好地处理你的场景   您。

     

希望这有帮助,

     

斯科特

答案 4 :(得分:0)

更简单的方法是使用质量保证检查器。使用Zapix工具,我可以安排我的网站每20分钟进行一次质量检查。 Zapix只是访问了该网站并收到了http响应。通过使用Zapix,它模仿了手动访问网站以触发电子邮件的功能。这样,应用程序池线程就会不断醒来。