如何使用依赖项和计划执行任务

时间:2012-08-10 23:37:47

标签: c# .net sql-server scheduled-tasks database-backups

我有一个必须安排的任务列表,就像cron一样。这适用于sql server上的备份。

数据库将以多种组合执行FULL,DIFF,LOGS备份。

所以:

  • 每天早上8点
  • 每小时DIFF
  • 每10分钟一次记录

但是,我有这个问题:

  • 如果服务器在上午8:15醒来,则不执行FULL任务。
  • 如果FULL失败,则无法执行DIFF& LOG
  • 如果服务器在星期六上午8:15醒来,LOG从8:20开始启动,那么完整必须等到下周一。
  • 如果LOG占用太多(上午9:01没有完成),那么当LOG尚未完成时,DIFF会启动。我不想那样!

我用quartz.net做这个,但这是切向的 - 我愿意改变lib,删除它等等。所以我的主要目标是任务的顺序/执行的可靠性。

在顺序代码中,这很容易做到:

  • DO_FULL THEN
  • DO_DIFF THEN
  • DO_LOG

但是,使用调度程序时,这是不可能的(至少使用石英)。

问题在于时间的管理。当任务被标记为每小时开始时,必须比硬规则更多提示,因为前一个可能没有完成。此外,FULL是开始循环的必要条件。

我想知道必须在这里应用算法。

2 个答案:

答案 0 :(得分:0)

最简单的解决方案是编写一个Windows服务(按设计,连续运行)。

  1. Windows服务唤醒其中一个线程(T0)8:00。
  2. T0执行必要的验证并在失败时引发警报和中止,否则会产生完整的备份线程T1。
  3. T1仅在所有验证都正常时执行,因此只需继续备份。
  4. 如果T1成功完成,服务将唤醒其差异线程(T2)并记录线程(T3)。
  5. T2和T3检查上次成功运行T1。如果T1失败,T2和T3也会中止。
  6. T2每小时执行一次,执行差异和睡眠。
  7. T3每15分钟执行一次。它必须检查T2是否正在运行,如果是,则再次进入睡眠状态(持续x秒)并再次尝试。如果T2未运行T3,则应履行其职责。
  8. 在一天结束时的某个预定时间,如果需要,应重置或中止所有线程。

答案 1 :(得分:0)

您需要跟踪已执行的任务。例如,要运行DIFF,必须先执行FULL。要实现此目的,请启动任务并将FULL状态设置为false。当FULL完成其工作时,将状态设置为true。当DIFF运行的时间到来时,它会检查FULL是否准备就绪(基于FULL生成的真值或假值)。如果不是,则DIFF只等待FULL发出已完成其工作的信号(真)。 LOG运行也是如此。这是实现顺序行为的简单方法。