在所有的服务器编程当中,定时任务永远是一个不可或缺的需求。
最直接的需求就是,每天凌晨0点0分的时候总是有一大堆的各种精力重置。
怎么来设计这个接口呢,想了几个方案:

  • 每秒触发
  • 每分钟触发
  • 每整点触发
  • 每天触发
  • 每个月触发

oh no!不靠谱啊,如果这接口真设计成这样,得有多烂,灵光一现,unix下的crontab表达式非常完美的解决了这个问题。

附上crontab表达式的语法说明如下:

crontab特殊的符号说明:

"*"代表所有的取值范围内的数字。特别要注意哦!
"/"代表每的意思,如"*/5"表示每5个单位
"-"代表从某个数字到某个数字
","分散的数字

crontab文件的使用示例:

30 21 * * * 表示每晚的21:30
45 4 1,10,22 * * 表示每月1、10、22日的4 : 45
10 1 * * 6,0 表示每周六、周日的1 : 10
0,30 18-23 * * * 表示在每天18 : 00至23 : 00之间每隔30分钟
0 23 * * 6 表示每星期六的11 : 00 pm
* */1 * * * 每一小时
* 23-7/1 * * * 晚上11点到早上7点之间,每隔一小时
* 8,13 * * 1-5 从周一到周五的上午8点和下午1点
0 11 4 * mon-wed 每月的4号与每周一到周三的11点
0 4 1 jan * 一月一号的4点

看起来很复杂的样子,但其实够用就好,我们也不需要实现全部特性。

  • 实现一个毫秒级别的定时器Update
  • 根据这个update函数实现一个秒级别定时器
  • 然后每秒取得自然时间与表达式中 分、时、几号、月份、星期几 分别匹配就可以实现了
  • 由于定时器除了增加以外,可能还需要一个删除功能,那就再提供一个定时器命名的功能,用于增删改查定时器是本身
  • 再加个测试函数。。完美

直接上代码:

也可以直接到 https://github.com/linbc/crontab.lua 下载代码

参考资料:

http://www.cise.ufl.edu/~cop4600/cgi-bin/lxr/http/source.cgi/commands/simple/cron.c

https://github.com/kikito/cron.lua

在所有的服务器编程当中,定时任务永远是一个不可或缺的需求。最直接的需求就是,每天凌晨0点0分的时候总是有一大堆的各种精力重置。怎么来设计这个接口呢,想了几个方案:每秒触发每分钟触发每整点触发每天触发每个月触发oh no!不靠谱啊,如果这接口真设计成这样,得有多烂,灵光一现,unix下的crontab表达式非常完美的解决了这个问题。附上crontab表达式的语法说明如 local handler -- do some routine job in Lua just like a cron job handler = function (premature) ngx.log(ngx.INFO,"==================== 定时任务 执行 开始===================...
function update_timer_fun() for k,v in pairs(update_timer.m_process_time_fun) do v(k,update_timer.m_porcess_run_time[k]); --注册一个新的update 定时器 经过over_time时间后销毁 销毁后回调over_fun(手动消耗也会回调over_fun
几乎在所有的项目中, 定时任务 的使用都是不可或缺的,如果使用不当甚至会造成资损。还记得多年前在做金融系统时,出款业务是通过 定时任务 对外打款,当时由于银行 接口 处理能力有限,外加 定时任务 使用不当,导致发出大量重复出款请求。还好在后面环节将交易卡在了系统内部,未发生资损。 所以,系统的学习一下 定时任务 ,是非常有必要的。这篇文章就带大家整体梳理学习一下Java领域中常见的几种 定时任务 实现。 线程等待实现 先从最原始最简单的方式来讲解。可以先创建一个thread,然后让它在while循环里一直运行着,通过sleep方法
目录一、实现方法二、实现过程1.创建 定时任务 执行 周期表(sys_cron)2.代码实现2.1创建spring boot项目,添加web、mybatis-plus、mysql相关依赖2.2 在项目中的application.yml 添加数据源2.3 创建 定时器 2.3.1 创建SysCron实体类2.3.2 创建CronMapper2.3.3 配置dao层包扫描2.3.4 配置 定时任务 2.4 启动项目,进行测试3.代码源码 在Spring Boot项目中,通过@EnableScheduling可启用Spring
wireshark可以使用 lua 来扩展wireshark的功能。 例如你可以用wireshark结合 lua 来做一个截获http传输并存储到磁盘的脚本。 首先定义一个监听器用来监听http数据包。local tap = Listener.new("http")然后定义里需要截获的分析好的数据,这需要使用Field对象。 例如local host = Field.new("http.host")-
延时和 定时器 lua t脚本程序中,往往需要用到延时和等待等逻辑功能。例如,你想得到每隔30秒查询当前内存,这里就需要用到延时和 定时器 。在每次打印后加上一个30秒的 定时器 或者30秒的延迟,既可以实现这个功能。本篇文章将介绍2个延时函数和4个 定时器 函数以及一个判定 定时器 激活状态的函数,讲解这些函数如何使用以及在什么环境下使用。 API说明 详细的API介绍见sys API章节和rtos
linux的运维者,逃脱不了 定时任务 的命题,最常用和快捷简单的是crontab,在少量机器的情况下,crontab效率还是比较高和比较便捷。但当机器越多、应用越多的情况下,继续使用crontab进行 定时任务 的管理配置,那严重影响工作效率。 机器多、服务多的情况下,就会遇到以下问题: 1.不知道哪个 定时任务 没配置好,瞎跑; 2.运维人员需要登录服务进行配置和管理; 3.运维人员需要全
写在前面的话: 自己偶尔工作中会用到crontab,待到用的时候,又想不起来具体怎么使用。趁着有点时间,找找资料、翻翻书整理了一下,然后就有了这篇稿子。权当是给自己留一个随手的笔记了。 这篇稿子的内容是从书上东看一点、西看一点,从网上东看一下、西看一下,算是转载,不算原创。 这里我们创建了一个名为 `myTimer` 的 定时器 对象,并设置了 定时器 的时间间隔为 1 秒,并将回调函数设置为 `myFunction`,最后启动这个 定时器 。 注意,在使用 `timer.create` 函数创建 定时器 对象时,需要使用 `:setInterval` 方法来设置时间间隔,使用 `:setCallback` 方法来设置回调函数,使用 `:start` 方法来启动 定时器 。同时,我们还可以使用 `:stop` 方法来停止 定时器 的运行。