0%

使用 Deno 运行定时任务

近期,我们项目组的小程序成功上线,为了方便社群运营,将小程序链接集成至企业微信群的欢迎语中。小程序链接由后端接口动态生成,且设置了最长30天的有效期限制。为简化链接获取流程,我专门编写了一段 Deno 脚本,实现链接自动获取并通过飞书机器人同步至群聊。鉴于 Deno 运行时对定时任务的内置支持,此次我选择直接采用 Deno Cron 进行任务调度,而非传统的 crontab 管理方式。

Deno Cron 简介

Deno 是一个现代的 JavaScript 和 TypeScript 运行时,它内置了对 cron 表达式的支持,使得定时任务的编写和管理变得非常简单。Deno 的 Deno.cron 函数允许你定义定时任务,并指定执行的时间间隔。

与 Crontab 的对比

传统的 crontab 是 Unix/Linux 系统中用于定时执行任务的工具。与 Deno cron 相比,crontab 更加底层,需要手动管理任务的执行时间和脚本路径。而 Deno cron 提供了更高层次的抽象,使得任务的定义和执行更加直观和便捷。

使用 Docker 运行 Deno Cron

作为一个长期运行的后台进程,我使用了Docker容器作为定时任务的运行时。以下是一个示例命令,展示了如何使用 Docker 运行 Deno cron 任务:

1
docker run -v $(pwd):/app -w /app --name deno-schedule -d denoland/deno deno run -A --unstable-cron task.ts

这个命令做了以下几件事:

  1. 使用 denoland/deno 镜像。
  2. 将当前目录挂载到 Docker 容器的 /app 目录。
  3. 设置工作目录为 /app
  4. 后台运行容器,并命名为 deno-schedule
  5. 运行 task.ts 文件,并启用 unstable cron 功能。

示例代码解析

下面是一个简单的 Deno 定时任务示例,它每周一上午 11 点生成一个小程序链接并报告到飞书:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
async function getAccessToken() {
const resp = await fetch(
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=XXX&secret=XXX",
);
const data = await resp.json();
return data.access_token;
}

async function genMiniAppURL() {
const accessToken = await getAccessToken();
const resp = await fetch(
`https://api.weixin.qq.com/wxa/generate_urllink?access_token=${accessToken}`,
{
method: "POST",
body: JSON.stringify({
"is_expire": true,
"expire_type": 0,
"expire_time": new Date().getTime() + 1000 * 60 * 60 * 24 * 30,
}),
},
);
const data = await resp.json();
return data.url_link;
}

async function reportToFeishu() {
const url = await genMiniAppURL();
await fetch(
"https://open.feishu.cn/open-apis/bot/v2/hook/XXX",
{
method: "POST",
body: JSON.stringify({
msg_type: "interactive",
card: {
config: {
wide_screen_mode: true,
enable_forward: true,
},
header: {
title: {
content: "小程序链接",
},
},
elements: [
{
tag: "div",
text: {
content: `小程序链接: ${url}`,
},
},
],
},
}),
},
);
}

async function work(){
console.log("Fetch Miniapp URL.");
reportToFeishu();
}

Deno.cron("Fetch Miniapp URL", "0 11 1 * *", async () => {
await work();
});

work();

在这个示例中,我们定义了一个每周一上午 11 点执行的任务,它会生成一个小程序链接并通过飞书报告。

总结

总的来说,Deno 在服务端领域表现出色,其内置的 cron 支持让定时任务管理变得简单高效,相比传统 crontab 更直观便捷。示例代码清晰展示了其强大的功能和易用性,极大地简化了开发流程,提升了系统的稳定性和可维护性。

扫码加入技术交流群🖱️
QR code