我在我的asp网站中使用石英,我在application_start方法中初始化调度程序并在application_end方法中关闭,我的触发器每天都会触发但我发现如果一段时间没有请求,我的调度程序会自动关闭,所以我的后台工作不会触发,有没有更好的方法来保持调度程序的寿命,并且只有在服务器停止时才关闭?
5 回答
为了更好地分享知识:
有两个建议:
一般来说,如果您需要可靠的日程安排,则不应在网站内进行。
如您所见,工作进程将在一段时间后关闭。即使您强制工作进程一直运行,也有可能导致它终止的条件。这不是一个好主意。
相反,您应该编写一个 Windows 服务并在其中运行quartz.net。
如果您无法安装服务(假设您处于共享托管环境中),那么您的选择就会受到更多限制。
我想知道同样的事情。最终,虽然我同意普遍共识,但我想看看如何做到这一点,因为我自己也遇到过类似的情况,我无法使用 Windows 服务。
我所做的只是创建一个新作业,当它执行时会向应用程序本身发送一个 HTTP 请求。对我来说,我将它指向一个仅包含@Datetime.Now.ToString()
.
向自身发送 HTTP 请求的操作应该足以让调度程序(和父工作进程)保持活动状态。
但是,它不会阻止应用程序在没有警告的情况下停止/回收。如果您想要一种方法来处理这个问题,那么您可能需要运行多个站点来同时 ping 自身和另一个站点。这样,如果一个站点出现故障,另一个站点可以点击它(假设它已启动)以将其恢复。
有一个 IIS 配置允许工作进程一直保持打开状态。我通过另一个 SO answer链接找到了这个设置。
编辑 C:\Windows\System32\inetsrv\config\applicationHost.config 以包括:
<applicationPools>
<add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>
Scott Guthrie(Microsoft .NET 产品经理)回答了一个与 OP 的问题(链接)直接相关的问题。
@Dominic Pettifer,
如果我设置 startMode="AlwaysRunning" 这是否意味着网络应用程序将“永远不会”关闭并且将始终保持运行,即使长时间没有流量访问该站点(当然,除非它是手动关闭的,或者服务器是关闭/崩溃等)?我问的原因是因为我喜欢在 IIS ASPNET 工作进程上运行后台线程/服务,而不是使用 Windows 服务(我们处理的客户端在其服务器上有很多安全限制,这使得运行 Windows 服务变得困难或不可能)。通常我必须设计一些定期访问网站的东西,以保持 ASPNET 工作进程处于活动状态并阻止它关闭。
这应该意味着应用程序和工作进程始终在运行 - 所以我认为这确实可以很好地为您处理您的场景。
希望这可以帮助,
斯科特
一个更简单的方法是使用质量保证检查器。使用 Zapix 工具,我可以安排我的网站每 20 分钟进行一次质量检查。Zapix 只是访问了该站点并收到了 http 响应。通过使用 Zapix,它模仿了手动访问网站以触发电子邮件的功能。这样,应用程序池线程就会不断被唤醒。