定时任务

原创 2016年05月31日 15:17:26
定时任务:
需求描述:在现有的实时通知功能的基础上添加功能,能够定时发送通知

需求背景:由于在系统中存在正常逻辑的发送通知的接口,并在调用发送通知的接口时会同时调用其他服务的实时接口,所以为了避免其他服务为了这个需求增加工作量,所以在发送任务的入口做判断,进行定时任务的逻辑

解决方案:1.接受客户端发过来的请求和头信息,判断是否为定时通知的请求,并将头信息和请求包专为二进制保存至redis中;

                     问题:在保存二进制的过程中,存在两个问题:

                             a是不能直接将信息保存至redis,因为redis遇到/0操作符时会理解为回车

                             b调用string2bin的接口时,由于该接口是宏定义,所以在编译时直接分配地址,所以在传参的时候必须传一个变量,二不能直接传一个零时变量的地址进去,在宏里面调用结束,进入下一层时,零时变量会析构,所以一旦内存被其他变量占用,那么就会出现问题;


                  2.解析请求包中的发送时间,并根据时间信息(精确到分钟)保存在缓存中,如201605301200代表2016年5月30日12点00分,该字段的member为待发送任务的零时Id;


                  3.新开一个线程,按照10秒中一次(时间根据实际情况定)的规则,在缓存中查找当前时间的字段,如果没有,continue,如果有,就依次将id取出来,并根据id在缓存中取出请求包和头信息,并保存至零时变量中;


                  4.修改请求包中的发送时间(为正常逻辑的时间),在新开的线程中调用正常逻辑,并将请求包和头信息传入;


                  5.发送成功之后,删除收件箱中的id以及id关联的相关信息(如果任务已被删除,在时间队列中扫描到该id,判断id找不到关联信息而跳过);

改进方案:经测试,上诉方案能支持一分钟一台服务器千条级别的任务同时发送,当任务数量剧增时,可用一下方案改进;
                 在上诉方案中增加一个发送任务的线程,具体实现为:从时间队列中取出id之后判断id的合法性,如果id合法,那么将id扔到消息队列中,时间队列本身不用关心任务的发送情况,任务的发送在专门处理发送的消息队列中处理

相关文章推荐

用Timer开发的一个定时任务

  • 2017年11月14日 10:55
  • 13KB
  • 下载

最老程序员创业开发实训8---IOS---在Swift中用定时任务显示Splash页面

在上一节中,我们用Swift实现了Splash页面的显示,但是仅仅显示Splash页面是不够的,我们需要显示Splash页面2秒,然后跳转到下一个页面,因此需要实现定时任务的功能。在Android中,...
  • Yt7589
  • Yt7589
  • 2015年09月10日 14:18
  • 2121

C#Quartz定时任务

  • 2017年10月24日 13:22
  • 890KB
  • 下载

注解式的定时任务

  • 2017年09月26日 16:17
  • 28KB
  • 下载

Java定时多线程任务实现(TimerTask)

java中实现多线程,可通过继承Thread类或实现Runable接口。实现Runnable接口比继承Thread类所具有的优势:适合多个相同的程序代码的线程去处理同一个资源;可以避免java中的单继...

配置为Windows定时任务

  • 2017年08月22日 11:30
  • 1.33MB
  • 下载

kettle定时任务

  • 2017年09月14日 16:45
  • 121KB
  • 下载

Spring定时任务+时间配置(附资源下载)

有的时候在项目中我们可能需要在某一个时间段定期的执行一段代码。spring就提供了这种定时框架。最后提醒一下对于分布式项目就尽量不要使用这个了,因为分布式项目最终会部署到多台服务器上,到了触发点时,会...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:定时任务
举报原因:
原因补充:

(最多只允许输入30个字)