我在我的asp网站上使用quartz,我在application_start方法中初始化调度程序并在application_end方法中关闭,我的触发器每天都会触发但我发现如果没有请求,我的调度程序会自动关闭,所以我的背景工作将不会被触发,有没有更好的方法来保持调度程序的生命周期,只有在服务器停止时关闭?
答案 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,它模仿了手动访问网站以触发电子邮件的功能。这样,应用程序池线程就会不断醒来。