探知,不断发现
探知不断发现
定时触发问题

定时触发问题

如果只是一个很少量的定时触发。可能很多人会把哪个东西加到浅程池来实现。

而我们这边的实现是采用队列方式。 所有还没有触发的东西都放在一个队列里。并且按触发时间排好。

比如说这是一个要求比较实时的。我们就不需要0.5S检查一下这个东西时间是不是到了。 如果是以天为单位的。哪么我们就要任务结束后计算出第二是什么时候。DEMO在MailSender,webshop里而都有。

我们顺便看一下时间问题。

将来任务

这个任务必须在3天后触发
TriggerTime = AddTime + 3days 这样就是一个三天后的时间
然后程序什么判断呢?
两种情况

  1. 现在时间还小于The Day,嗯时间还没到任务不需要触发.
  2. 时间大于 TheDay,任务做了吗? 没有做。哪就要敢紧做了? 换句话说,三天后要发也就是说现在必须发三天前的东西,两天前没有关系。

很明显第二个才是我们要的转换程序思维一下
TriggerTime<CurrentTime
AddTime + 3 days <currentTime
AddTime < CurrentTime-3days
AddTime < DateTime.Now - 3days .这个是整数天 (周天)

有时候我们希望的是虚数天 (来源于虚岁,1出生就当做1岁了) 就是
TriggerTime.Date < DateTime.Today  (Date 和 Today 都是 00:00:00)
例子,比方说是3月1号 8点创建的。 本来我们是要等时间到 3月4号8点。但如果是虚数天的话。 8点创建到3月1号 23 点 59分59妙999毫秒就是一天。这是一个不完整的一天。也算做一天,就是虚数天。
为了数据库查询的方便我们就可以变成
TriggerTime<DateTime.Today + 23点 59分59妙999毫秒
 =>  TriggerTime<DateTime.Today.Adddys(1) 也不差一秒了。再迟这一秒关系不大
最终得出就是
 AddTime< DateTime.Today - 3adys +1;
将来任务我们一般是哪个实体本身会带一个IsFinishTask的标志,完成的时候我们就把它改天true了,查询的时候我们就是Isfinish=false并配合时间来查询。

因为我们只限制了他一定要做任务结果就是如果这一天错过了(服务器挂掉了),他也会补发。如果只想说这一天发过期了就不发了。
哪应该再加一个条件 TriggerTime>DateTime.Today.
或者是直接用日期了
TriggerTime.Date = CurrentTime.Today

到期任务

比如说有一个试用周期快到了,你希望提醒用户来续费。 我们的直刻感觉就是下面的这种
(TotalTrialDays - SqlMethods.DateDiffDay(it.CreateTime, DateTime.Today)) == ReminingDays

实际上也是可以转化成上面哪种 比如还剩2天的时候要提醒 TotalTrialDays-ReminingDays 所以
TraggerDay 就是 CreateTime + TotalTrialDays-ReminingDays
CreaeTime.Today <= DateTime.Today - TotalTrialdays +ReminingDays
TotalTrialdays + CreaeTime.Today <= DateTime.Today +ReminingDays
TotalTridays + CreateTime.Today-Today <= LevlDays
TotalTridays - (-CreateTime.Today+Today) <= LevlDays 小于的话就一定会触发

跟上面的是一样的
需要注意的是:
比如说有这样的一个任务 Invoice在生成14天后还没有被支付的话我们必须发邮件告诉他。
我们必须考虑的是。如果我们的这个程序重启了会不会造成这封邮件被多次好送。
我们必须记录这个任务有被执行了。

posted on 2010-04-21 12:58  lovebanyi  阅读(859)  评论(0编辑  收藏  举报