node.js - 扫描作为 cron 字符串的 DynamoDB 属性并根据当前时间进行过滤
问题描述
我有一个包含以下项目的 DynamoDB 表
{
"jobId":<job1>,
"cron" : "* 5 * * *"
},
{
"jobId":<job2>,
"cron" : "* 8 * * *"
}
我需要根据当前时间扫描基于 cron 字符串的下一个执行时间在下一个 5 分钟内的项目。有没有办法可以在扫描时将 cron 转换为有效的下一次执行时间?我在 AWS Lambda 和cron-parser
npm 库中使用 node.js 从 cron 字符串中提取 next_execution 时间。
解决方案
请注意,扫描整个表会随着时间的推移而减慢。您可能需要考虑一些其他数据存储或结构来存储此数据。
这就是说这样的事情可以工作:
const results = await client.scan({ TableName: 'tableName' }).promise();
const cronItems = results.Items;
const intervals = cronItems.map((item) => {
return cronParser.parseExpression(item.cron);
});
const now = new Date();
const fiveMinMillis = 300 * 1000;
const within5Mins = intervals.filter((interval) => {
const timeUntil = interval.next().valueOf() - now.valueOf();
return timeUntil < fiveMinMillis;
});
请注意,您实际上需要scan(...)
迭代调用,直到响应不包含LastEvaluatedKey
属性。 详情请看这里。
推荐阅读
- c# - 如何在 c# 上使用异步连接通过套接字发送多条消息
- react-native - 数组计数中的 this.state.someThing
- java - 为按钮分配字符串值 - JavaFx
- php - cURL 可以通过命令行正常连接,但不能在 PHP 中连接的原因?
- .net-core - 带有配置文件的 Dot Net Core 中的 IoC/DI
- c - 在 C 中使用 unsigned int 有什么意义?
- android - 单击按钮移动到下一个 EditText
- javascript - 如何在字符串中获取@之前和之后的所有内容
- android - 'let' 在 livedata observable Kotlin 的 lambda 表达式中是什么意思
- json - 使用 STPAddCardViewController 作为视图控制器时,收集卡片数据的正确参数是什么?