我们在工作中需要一个工作服务器,我目前正在玩 Quartz.net,但创建自己的想法对我很有吸引力。至少了解 Quartz.net 可能在幕后做的事情不会损害我更有效地使用它的理解/机会。
所以我的问题是你将如何在没有轮询的情况下在线程上获取和解雇工作?如果您每 2 分钟检查一次“工作商店”以查找需要解雇的工作,您可能会延迟大约 2 分钟。如果您减少轮询时间,则会增加您的工作商店的压力,并且仍然无法获得真正的开始时间。您可以在接下来的两分钟内预加载作业,并让线程在剩余时间内进入睡眠状态,以便它们在适当的时间开始,但如果您的轮询时间很长(删除、重新安排等),这似乎很笨拙并且容易出现问题。我正在剖析 Quartz 以弄清楚它是如何做到的,但我想知道我是否遗漏了一些基本的东西。
编辑:
像 Kevin 最初描述的线程结构似乎是你应该如何做一个工作服务器。它以最少的开销为您提供最大的灵活性。因为线程对于大多数人来说都是一个皮塔(也许只有我 :) 更简单的轮询示例将在 90% 的情况下完成工作,但代价是失去灵活性和更多开销。
另一方面,除非您将其设为单线程并执行单个作业,否则无论如何您都必须处理线程。还不如全力以赴,找出信号。
我也同意凯文的观点,即您在轮询数据库示例中声称免费获得的东西并不是真正免费的。如果它是线程/等待应用程序,您将像编写代码一样编写代码。如果您的轮询数据库作业服务器在作业过程中发生故障怎么办?两者都将依靠一些持久的存储来跟踪他们的状态以防发生灾难。
如果您将“jobstore”提升到一个抽象级别并且它不是基于正常的 ACID(正确的术语?)数据库会怎样。现在我相信你的很多“免费”东西都不再可用(交易?)。