• 定时触发问题


    定时触发问题

    定时触发问题

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

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

    比如说这是一个要求比较实时的。我们就不需要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天后还没有被支付的话我们必须发邮件告诉他。
    我们必须考虑的是。如果我们的这个程序重启了会不会造成这封邮件被多次好送。
    我们必须记录这个任务有被执行了。

  • 相关阅读:
    (10)进程---Manager数据共享
    (9)进程---JoinableQueue队列
    (8)进程---Queue队列
    (7)Pool进程池
    (6)进程---Event事件
    (5)进程--锁和信号量
    (4)进程---daemon守护进程和join阻塞
    XSLT知识点【一】
    XSL-FO知识点【一】
    XPath知识点【一】
  • 原文地址:https://www.cnblogs.com/lovebanyi/p/1717126.html
Copyright © 2020-2023  润新知