从global.asax vs quartz.net运行计时器

时间:2012-06-19 20:24:19

标签: c# asp.net scheduled-tasks global-asax quartz.net

我正在开发一个asp.net网站,需要每天访问一些社交媒体网站,以获得一揽子朋友/关注者数据。我选择了arvixe商务舱作为我的主机。在未来,如果我们成长,我会喜欢进入专用服务器并运行Windows服务,但是由于此时不在卡中,我需要另一种可靠的方式来运行计划任务。我熟悉从app_code(global.aspx)运行线程计时器。但是,应用程序池回收会导致计时器出现问题。我从来没有像石英那样使用任务调度,但是在stackoverflow上已经阅读了很多关于它的内容。我正在寻找一些关于如何实现目标的建议。我使用这两种方法的一个大问题是,由于api呼叫限制,我将需要爬虫线程定期休眠长达一个小时。我的第一个想法是使用数据库来保存作业的开始和结束。当应用程序池回收时,我会清除任何未完成的部分,并且只启动那天没有运行记录的部分。这里的专家怎么想?这种调度的示例架构的任何良好链接?

4 个答案:

答案 0 :(得分:1)

使用什么方法并不重要,无论是自己动手还是使用Quartz。你受ASP.NET / IIS的支配,因为那是你想要托管它的地方。

您是否有备用计算机可以运行计划任务并将数据上传到托管数据库?说实话,它可能更安全(取决于您的用例),然后尝试在ASP.NET中运行调度程序。

答案 1 :(得分:0)

有点像布莱恩的帖子;

找一台备用电脑。

不是允许数据库访问,而是在您的站点上调用Web服务。此服务调用应该是您尝试执行的过程的发起者。不要试图将params放入其中,就像“StartProcess()”这样的东西应该可以正常工作。

至于睡觉并稍后恢复,请查看Workflow Foundation。有一些很好的内置功能来保持状态。

不要将您的数据库暴露给外部世界,而是公开该页面或Web服务并在其周围包含一些安全性。 WCF有一些很好的内置安全功能。

最好的部分是当您决定离开时,您可以保留您的Web服务并以相同的方式从Windows服务中调用它。

答案 2 :(得分:0)

只要您使用持久性作业存储(如数据库)并编写和安排作业,以便他们可以处理中途被杀的事情,让IIS回收您的流程并不是什么大不了的事。

更大的问题是,如果没有流量,IIS会关闭您的网站。如果你可以保持你的网站,那么只需确保你适当地设置失火政策,并确保你的工作存储了他们从中断所需的状态数据,你应该能够把它拉下来。

答案 3 :(得分:0)

如果您与语言无关,并且不介意用您最喜欢的Linux支持的语言编写“job-activation-script”......

对我来说效果很好的一个解决方案是:

  1. 获得相对便宜,稳定的Linux托管(来自信誉良好 公司),
  2. 在.Net托管平台上创建一个WCF服务,该平台将包含您要定期运行的逻辑(RESTful或SOAP或XMLRPC ......适用于您),
  3. 使用您选择的语言编写的Linux托管cron jobs处理调用(我使用PHP)。
  4. 工作得非常好,就像我说的那样。无需VPS费用,可配置和外部激活。我有一个中心位置,我的工作被激活,99%到100%的正常运行时间(从未有任何失败)。