我是Quartz.NET的新手,所以请在这里跟我说。
我使用Quartz作为在服务器群集上运行的网站的一部分。为了促进作业的负载平衡,他们通过负载平衡器调用Web服务(在同一网站上运行),以确保它们在负载最小的Web服务器上执行。其中一些工作可能需要几个小时才能完成。这个问题是Quartz作业和Web服务可能在不同的机器上运行。如果运行Quartz作业的机器在等待Web服务在另一台机器上完成时崩溃,那么Quartz将不知道任务是否完成而没有问题。我可以异步调用Web服务,但随后Quartz会认为无论Web服务中发生了什么,都可以立即成功完成作业。这不允许我确保同一个工作不会同时运行,因为Quartz会认为它已经完成了。它也不允许重试失败或允许我查看当前正在运行的作业。
Quartz中有一个我可以忽视的功能吗?有没有其他人必须处理类似的情况?是否有更好的方法来平衡Quartz作业?
目前,我认为我需要修改Quartz JobRunShell类,以便不设置作业的完整状态并触发(不确定这是不是正确的地方?)。然后允许我的Web服务在完成后设置状态。我还需要添加代码来处理Web服务崩溃且作业永远不会完成的情况。为此,我计划在我的Web服务上创建一个线程,定期告诉Quartz该作业仍在运行(通过我将添加到数据库的新时间戳字段)。我必须定期检查正在运行的作业以查看它们是否仍在运行(通过新字段),如果它们暂时没有更新(比如更新周期的5倍),那么我&#39 ; ll假设作业失败并使作业失败并重试(如果适用)。
任何帮助/评论都将不胜感激。
编辑:我使用的是Quartz.Net 2.3版
答案 0 :(得分:3)
Quartz clustering功能可以自行执行负载均衡。如果您使用它,您可以完全避免让您的工作调用Web服务。相反,您将配置您的作业以直接运行您需要的代码,石英负载平衡将根据负载选择将运行作业的机器。虽然quartz.net存在clustering支持,但只有石英文档的java版本,您可以在http://www.quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering
找到一个很好的解释。要使群集正常工作,您应设置quartz.jobStore.clustered=true
属性和configure an ADO.NET JobStore