Я хотел бы создать задание cron только с функциями Firebase.
Ниже приведен мой код:
const functions = require('firebase-functions');
var admin = require('firebase-admin');
var serviceAccount = require('<private_key_path>');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://<project_name>.firebaseio.com'
});
cronJob_2min()
function cronJob_2min() {
console.log('cronjob started')
setTimeout(function () {
testTask1()
cronJob_2min()
}, 120000);
}
var testTask1Counter = 0
var testTask1Status = true
function testTask1() {
if (testTask1Status) {
testTask1Status = false //flag the task is started to avoid re-trigger again before the task is done
testTask1Counter++
console.log('testTask1 Executed: ', testTask1Counter)
testTask1Status = true //flag the task as completed to let next round trigger execute the function
}
}
После того, как я его развернул, он работает, как и ожидалось, каждые 2 минутыон выполнит cronJob_2min()
и вызовет функцию testTask1()
.Но он работает только в течение приблизительно 20 минут, потому что в журнале счетчик отображается только до 10.
Похоже, сервер перейдет в "спящий режим" через определенное время.
Я понимаю, что работаеткод в фоновом режиме будет стоить ему квоты процессора, и я в порядке.
Но я хотел бы знать, как сделать так, чтобы он всегда "проснулся"?
Спасибо.
Редактировать 1
Примечание: моя облачная функция экспортирована с другими функциями onCall, но это слишком долго, поэтому я не помещал в это сообщение.Код, который я размещаю сверху, на самом деле работает, просто console.log внутри cronJob_2min()
относится к одной из моих функций onCall sendEmail
.
Редактировать 2
Возможно ли, чтобы таким образом можно было бодрствовать?
//Setup the express, middleware, etc... I will skip that code here
router.get('/wakeUp', function (req, res) {
setTimeout(function () {
var theUrl = "https://us-central1-<project_name>.cloudfunctions.net/api/wakeUp"
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
callback(xmlHttp.responseText);
}
xmlHttp.open("GET", theUrl, true);
xmlHttp.send(null);
}, 120000);
return res.status(200).send('Tata! I am awake! (I suppose)')
})
app.use(router)
exports.api = functions.https.onRequest(app)
Если функции Firebase не достаточно умны, чтобыизбегать http-запроса от него самостоятельно, иначе это будет работать?