我只需要运行一次cron作业即可在设置的时间间隔后执行一次特定的云功能,但是有点不确定该怎么做。有什么办法可以通过当前的Google云平台来做到这一点?
答案 0 :(得分:1)
在下面的讨论中通过评论进行更新:
如果要“在创建后2小时内在Firestore数据库中更改文档”,可以执行以下操作:
firebase.firestore.FieldValue.serverTimestamp()
如果要通过cron作业触发Cloud Function,请注意,通常可以通过HTTP Cloud Function通过cron作业调用Cloud Function URL来实现。
您可以使用cron-job.org之类的外部服务,也可以使用GCP的App Engine和Cloud Pub / Sub
观看此视频:https://www.youtube.com/watch?v=fEBPAMSk5_8
和此博客文章:https://firebase.googleblog.com/2017/03/how-to-schedule-cron-jobs-with-cloud.html
均来自Firebase团队。
最后请注意,最近GCP推出了新产品Cloud Scheduler,可用于调用HTTP Cloud Functions。
答案 1 :(得分:1)
抱歉回复晚了。曾几何时,我也被这个问题困住了。您确实可以安排在特定时间执行一次作业。但是,您必须使用多个平台,因为 Firebase Cloud Function 对 cron 任务有时间限制。如果您查看 Quotas and limits document for Time Limit of Firebase,您可以看到 Firebase 云函数设置了时间限制,直到它们被取消(540 秒或 9 分钟)。因此,您无法使用云功能 cron 超过 9 分钟后执行的作业。但是您可以使用 Heroku 服务器在不付费的情况下进行作业。不幸的是,如果时间间隔内没有任务,Heroku 应用程序会在 30 分钟后休眠。但是,您可以使用外部服务器(例如 cron-job.org)保持唤醒状态。您可以通过每分钟不到 30 分钟对您的 Heroku 应用程序应用 ping 来无限地唤醒您的应用程序。您可以使用 node-schedule 通过在此处使用以下代码来定时执行一次作业:
const schedule = require('node-schedule');
const date = new Date(2012, 11, 21, 5, 30, 0);
const job = schedule.scheduleJob(date, function(){
console.log('The world is going to end today.');
});
您可以获取 Firestore 的当前时间或时间戳,并将时间间隔添加到当前日期以根据需要进行安排。不要忘记使用时区。您可以使用规则来设置时区:
const rule = new schedule.RecurrenceRule();
rule.dayOfWeek = [0, new schedule.Range(0, 6)]; //all days
rule.hour = req.body.hour;
rule.minute = req.body.minute;
rule.second = req.body.second;
rule.tz = "Europe/Istanbul"; // You can specify a timezone!
在这里,您可以通过从用户那里获取时间规范来获取来自客户端的请求。并使用调度作业模块来完成这样的一项时间任务:
const job = schedule.scheduleJob(rule, function(data) {
console.log("Job ran @", new Date().toString());
}.bind(null, dataFuture));
在这里,您可以像输入 .bind()
变量一样输入带有 dataFuture
的用户数据。如果您的用户使用原生 android 平台,您可以通过输入 hour_of_day
和 minute
来指定时间间隔:
Date currentTime = Calendar.getInstance().getTime();
Locale aLocale = Locale.forLanguageTag("tr-TR");
Calendar calendar = Calendar.getInstance(aLocale);
calendar.setTime(currentTime);
calendar.add(Calendar.MINUTE, 1);
calendar.add(Calendar.HOUR_OF_DAY, 4);
或者,您可以使用 Cloud Task 平台。不过可能有点难用。