Как настроить 6-месячный таймер в node.js - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь запланировать посты в социальных сетях на срок до 6 месяцев.Я использую node-cron , который был вдохновлен gnu cron .Я установил скрипт для запуска каждую секунду, чтобы регистрировать 'tick!' для тестирования.Однако, если этот узел nodeJS перезапускается или выходит из строя, работа теряется .

Я думал, что node-cron затронул Crontab, но Crontab -l возвращает no crontab for kevindanikowski.

Есть ли другой (лучший) способ, которым я должен планировать задания на месяцы раньше?

Или есть что-то в узле cron, к которому я скучаю?убедитесь, что я не потерял cronjob?

1 Ответ

0 голосов
/ 13 июня 2018

Для действительно длительных таймеров вам необходимо каким-то образом хранить данные тайм-аута на диске.Как вы упомянули, если вы делаете это исключительно в памяти, вы потеряете информацию о времени при перезапуске сервера.

Способ справиться с этим прост.Это тот же алгоритм, который использует cron:

  1. Запись, когда вы хотите, чтобы тайм-аут произошел на диске - формат зависит от вас, вы можете использовать формат cron или придумать свой собственный.Поскольку это javascript, у меня будет соблазн просто записать в формате JSON.

  2. Считайте файл синхронизации в вашу программу.Есть два способа сделать это.Если вас беспокоит производительность во время выполнения, прочитайте ее один раз при запуске вашей программы.Однако это означает, что вам нужно перезагрузить сервер, если вы редактируете файл.Если вы хотите, чтобы обновления для файла были получены автоматически, читайте его каждый раз, когда вы хотите обработать события синхронизации.

  3. Периодически запускать цикл таймера.Крон, например, имеет разрешение в одну минуту.Поэтому cron запускает цикл таймера каждую минуту.Если это достаточно хорошо, чем бегать каждую минуту.Для меня я бы делал setInterval() каждые 30 секунд или около того.Обратите внимание, что запуск цикла таймера каждую секунду не так уж и тяжел в JavaScript на любом приличном процессоре.

  4. Обработка событий таймера из файла в цикле таймера.Просмотрите все события и проверьте, не истек ли срок их действия.

Вот и все.Так работают все системы планирования (календарь Google, cron и т. Д.).

Вот очень простая реализация javascript:

var events = require("events.js");

// Assume events.js look something like:
// return [ {
//    timeout: <millisecs like what Date.now() returns>,
//    callback: <function>
// } ]

setInterval(function(){
    var now = Date.now();
    events.forEach(e=>{
        if (e.timeout >= now) {
            e.callback(); // execute event
        }
    });
    events = events.filter(e=>e.timeout<now); // remove stale events
},10000); // every 10 seconds

Вы можете добавить такие необычные функции, как сохранение текущих событий на диск, если в коде есть какие-либо изменения, сделать формат тайм-аута понятным для человека.для отладки определите систему для передачи аргументов в функцию обратного вызова события и т. д. Но суть очень проста.

...