在 Deno 中设置 CronJob

举报
胡琦 发表于 2021/01/17 14:20:53 2021/01/17
【摘要】 CronJob即定时任务,就类似于Linux系统的crontab,那在Deno中应该如何使用呢?

群里的大佬已经在探讨"Deno 是一个迈向错误方向的 JavaScript 运行时"了,而我,多年经验的Copy攻城狮,依旧只能看懂些边边角角的知识点,然后分享出来还被大佬批得体无完肤。无奈,以目前Copy攻城狮对JavaScript的掌握程度,也只配 API 调用师的水准。有的人一出生就是王者;有的人从青铜一步一步"迈向CEO赢取白富美走向人生巅峰";有的人同样是青铜,十年以后还是青铜,“慢进则退”,一步一步沦落到“癫疯人生”。废话太多,还是先看看 Deno 中的 CronJob 如何写"Hello World".

什么是 CronJob

CronJob即定时任务,就类似于Linux系统的crontab,在指定的时间周期运行指定的任务。比如小明每天晚上都会问候她异地的女朋友并送温暖,比如“铝盆友彩虹屁 bot”遇上 Deno定时发送邮件就依赖于 Serverless平台提供的周期触发函数功能,再比如在一些服务编排脚本中时常能看到诸如schedule: "*/1 * * * *",也许这就是 CronJob。本质上CronJob是一个调度程序,使应用程序可以调度作业在特定日期或时间自动运行。今天,我们将把CronJob集成到Deno应用程序中,有兴趣看看吗?

安装 Deno

前面的文章中基本都没有提及 Deno 的安装,在国内,我们使用 "vscode-deno 之父“JJC大佬为我们提供的镜像服务进行安装,地址为https://x.deno.js.cn/,简单的安装教程如下:

# 安装最新版
## 使用 Shell:
curl -fsSL https://x.deno.js.cn/install.sh | sh

## 使用 PowerShell:
iwr https://x.deno.js.cn/install.ps1 -useb | iex

# 安装某个特定版本
## 使用 Shell:
curl -fsSL https://x.deno.js.cn/install.sh | sh -s v1.0.0

## 使用 PowerShell:
$v="1.0.0"; iwr https://x.deno.js.cn/install.ps1 -useb | iex

# 验证安装
deno --help

deno_cron

目前deno官方第三方插件库中关于cron的库有3条,其中deno_cron目前 35星。deno_cron 是一个在Deno中使用的智能cron作业调度程序库,它使您可以编写具有大量灵活性的可读cron语法。对于许多开发人员而言,编写cron语法和操作可能非常繁琐。这个插件提供了非常友好的开发人员api,可以编写所需的任何作业计划程序的cron语法。

可通过以下方法引入:

import {cron, daily, monthly, biweekly, weekly, hourly, every15Minute, everyMinute, start, stop } from 'https://deno.land/x/deno_cron/cron.ts';

细心的朋友可能直接去读源码了,核心包括大量空行大概168行,这不禁让我们想起了npm包is-promise,这个只有两行代码的包的周下载量接近千万次,但愿同样的事情不会再复现!

我们可以使用 cron 在Deno中定义自定义时间表,如:

cron('* * * * * *', () => {
    // run some task
});

# 其中
*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    │
│    │    │    │    │    └ 星期 (0 - 7) (0 或者 7 is 星期日)
│    │    │    │    └───── 月 (1 - 12)
│    │    │    └────────── 日 (1 - 31)
│    │    └─────────────── 时 (0 - 23)
│    └──────────────────── 分 (0 - 59)
└───────────────────────── 秒 (0 - 59) - [可选 默认 01]

这些星号是用来做什么的呢?

  • 第一个星号占用秒数。取值范围为0-59
  • 第二个星号使用分钟数,并且取值范围为0-59
  • 第三个星号使用小时数,其值介于0-23之间
  • 第四个星号为月份中的一天,其值在1-31之间
  • 第五个星号为一年中的月份,其值在1-12之间
  • 第六个星号是星期几,取值范围是0-7

例如每隔一秒打印信息和i++的值:

import { cron } from 'https://deno.land/x/deno_cron/cron.ts';

let i = 0;
cron('*/1 * * * * *', () => {
    // run some task
    console.log('This is a same thing', i++)
});
deno crondeno cron

当然,除了设置 * , 我们还可以调用其他api,如使用everyMinute执行每分钟的任务:

import { everyMinute } from 'https://deno.land/x/deno_cron/cron.ts';

everyMinute(() => {
    console.log(new Date())
})
deno crondeno cron

此外还可以调用 start() 和 stop() 两个方法分别启动和停止所有的 cronjob:

import { cron, start,stop } from 'https://deno.land/x/deno_cron/cron.ts';
let i = 0;
cron('*/1 * * * * *', () => {
    // run some task
    console.log('This is a same thing', i++)
    if (i != 5) {
        start()
    } else {
        console.log('Stop!')
        stop()
    }
});
deno crondeno cron

小结

在 deno 中使用 cron,您学废了吗?今天的分享就到这里,希望大家感兴趣的话可以看看源码,如果对您有启发欢迎评论区和我探讨,如有不足之处,欢迎批评指正!

https://github.com/rbrahul/deno_cron/blob/master/cron.ts

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。