Quartz.NET与Windows计划任务相比有哪些不同?

31
我正在寻求Quartz.NET和Windows计划任务之间的比较。
它们有何不同?各自的优缺点是什么?我应该如何选择使用哪一个?
谢谢。
4个回答

27

使用Quartz.NET,我可以对之前提到的一些点进行对比:

  1. 编写代码 - 您可以用.NET语言表达自己的意图,编写单元测试和调试逻辑
  2. 与事件日志的集成 - 您可以使用Common.Logging,甚至将日志写入数据库。
  3. 强大且可靠
  4. API更加丰富

这主要取决于您的需求。Windows定时任务可能已经提供了您所需的所有功能。但是,如果您需要集群(分布式工作者)、精细控制触发或错误处理规则,您可能会想查看Quartz.NET在这些领域所提供的功能。

选择最简单的功能以满足您的需求,但又要足够抽象以允许更改。


1
如果你不熟悉Windows Scheduler API或Quartz.Net API,那么我认为你使用Quartz.Net会更快。+1 - yorah
@Marko,Quartz.Net 可能会影响网站性能。因为在 Windows 计划程序的情况下,它会在不同的线程中运行。请给予建议。 - Manas Kumar
2
你可能会混淆线程和进程。Windows调度程序确实在它自己的进程中运行。只要它们都在同一台机器上,它们将占用机器的资源。你可以将调度程序托管在Windows服务下,无论是在同一台机器上还是完全不同的机器上。 - Marko Lahma
请将现有链接 http://quartznet.sourceforge.net/ 更改为 http://www.quartz-scheduler.net/,因为前者已经失效。 - Richard Lucas
@MarkoLahma,我认为Quartz.NET非常有用和智能。但是,我无法创建一个每周的计划。你能否请看一下这个问题:http://stackoverflow.com/questions/34026183/schedule-quartz-net-trigger-that-executes-once-a-week?noredirect=1#comment55808278_34026183? - Jack

18

在安装另一个调度程序之前,我的第一反应是尝试让 WinScheduler 能够满足您的需求 - 原因如下:

  1. 无需安装 - 默认已安装并启用
  2. 无需编写代码 - 作业以元数据形式表达
  3. 与事件日志等集成
  4. 健壮可靠 - 大型公司如微软、谷歌都在使用它
  5. API 相对丰富 - 可以创建作业、检查状态等
  6. 与远程管理工具集成
  7. 安全集成 - 在不同凭证下运行作业
  8. 监控工具

如果 WinScheduler 不能满足您的需求,则可以考虑 Quartz。Quartz 当然也有许多这些功能,但是如果可能的话,建议不要再添加另一个需要拥有和管理的服务。


1
我做出了类似的推理:当Windows可以满足您的需求时,为什么要使用第三方工具呢?不过我想确保自己没有错过任何机会。 - Serge Wautier
2
@读者:这似乎很明显,但是...如果您选择使用Windows任务计划程序,实际上您正在将应用程序的一部分暴露给外部世界。任何具有适当权限的人都可以修改(甚至删除)您的应用程序任务。这可能对您来说是问题,也可能不是问题。 - Pressacco
@Pressacco 对不起,我评论了这么旧的帖子,但这不是内联测试的作用吗?伪代码示例:if (task.Exists) do nothing else (task.Create) - Wolfish
@Wolfish:我想表达的是,如果你依赖于外部服务(例如Windows任务计划程序),那么你的应用程序将面临超出你控制范围的外部事件(例如意外删除任务)。另一方面,如果你的应用程序在内部管理调度...那么拥有防御性代码就不是那么重要了。我的偏好是将调度保持在应用程序内部。话虽如此,也有一些项目不适合这样做。http://en.wikipedia.org/wiki/Defensive_programming - Pressacco
@Pressacco 啊,但我们不是总是在与我们代码的用户作斗争吗?嘿。我理解你的观点。 - Wolfish
我认为这个讨论是非常有争议的。对我来说,我希望实现者能够轻松地配置作业。在我们公司,部署过程是自动化的。我真的很喜欢在任务完成后杀死整个exe或作业的方式。我可能会把这个工作任务交给任何可能忘记处理资源的开发人员。相比于http://bugsquash.blogspot.com/2010/06/embeddable-quartznet-web-consoles.html,TaskScheduler的UI对于非开发人员来说更容易使用 :) 正如@Marko所说,“足够抽象以允许变更”非常重要,因此我们将重构现有代码以实现这一点。 - bunjeeb

3

对我来说,其他答案中没有包括的一个重要区别是由计划程序执行的内容。

Windows任务计划程序只能运行可执行程序和脚本。为Quartz编写的代码可以直接与项目的.NET组件交互。

使用任务计划程序,您需要编写一个shell可执行文件或脚本。在该shell内部,您可以与项目的组件进行交互。虽然编写这个shell代码并不是一个困难的过程,但您必须考虑部署额外的文件。

如果您预计在项目生命周期内添加更多的定期任务,则可能需要创建其他可执行shell或脚本文件,这需要更新部署过程。使用Quartz,您不需要这些文件,这降低了创建和部署其他任务所需的总体工作量。


0

不幸的是,Quartz.NET作业程序集无法在不重启进程/主机/服务的情况下进行更新。对于一些人来说(包括我自己),这是一个相当大的问题。

完全有可能为在任务计划程序下运行的作业构建框架。基于MEF的程序集可以由单个控制台应用程序调用,并通过配置UI进行管理。以下是一个受欢迎的托管包装器:

我很喜欢与Quart.NET一起工作的短暂时间,但重启要求是一个无法克服的大问题。Marko多年来一直在做出伟大的贡献,并且他总是乐于助人和响应迅速。也许有一天该项目将获得多个AppDomain支持,这将解决这个问题。(话虽如此,如果他和他的贡献者决定承担这项工作,那么这将是一项艰巨的工作。向他们致敬。)

引用Marko的话,如果您需要:

  1. 集群(分布式工作者)
  2. 对触发或误操作处理规则进行细粒度控制

...那么Quartz.NET将是您的首选。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接