Хобрук: Ваш путь к мастерству в программировании

Планировщик для узла, который работает ›25 дней.

Мне нужен планировщик заданий для веб-приложения, созданного на узле. Я просмотрел как node-cron, так и node-scheduler, но стенд, похоже, построен поверх функции Node setTimeout(). Проблема в том, что setTimeout() имеет максимальное время ожидания примерно 25 дней, как указано здесь: http://nodejs.org/api/globals.html#globals_settimeout_cb_ms

Если мне нужно расписание, скажем, каждый третий месяц... как мне это решить?

15.08.2014

  • Что насчет системного cron? Вы можете использовать его. 15.08.2014
  • Вы можете попробовать node-schedule, задание, похожее на cron и не похожее на cron. планировщик для Node. Еще одна библиотека, которую стоит попробовать, — это agenda, легкая библиотека планирования заданий для Node. 15.08.2014

Ответы:


1

Посмотрите на эту строку в node-cron: https://github.com/ncb000gt/node-cron/blob/master/lib/cron.js#L382

В основном это указывает на то, что node-cron обрабатывает переполнение setTimeout() и разделяет больший временной интервал на несколько меньших. Вы должны быть в состоянии использовать его безопасно.

На самом деле эта функциональность покрывается модульные тесты. Если значение, предоставленное setTimeout(), больше максимального, оно сработает немедленно. Этот модульный тест проверяет, не сработает ли тест после ввода огромного значения (1000 месяцев) во временном окне 250 мс.

'test long wait should not fire immediately': function(assert) {
    assert.expect(1);
    var count = 0;
    var d = new Date().getTime() + 31 * 86400 * 1000;
    var job = cron.job(new Date(d), function() {
      assert.ok(false);
    });
    job.start();
    setTimeout(function() {
      job.stop();
      assert.ok(true);
      assert.done();
    }, 250);
},
15.08.2014
  • Вы знаете, работает ли это после перезапуска приложения? 15.08.2014
  • @Mr.Birkoff - если вы имеете в виду после того, как процесс узла был убит и запущен снова - в этом случае, конечно, setTimeout не будет сохранен. 15.08.2014
  • да..., не лучше ли ему поставить системный cron? 25 дней это большой срок? Что ты думаешь? 15.08.2014
  • @RodrigoNascimento - я не знаю, что OP собирается делать с таким большим интервалом. Трудно сказать, подходит ли системный cron лучше. 15.08.2014
  • Я это понимаю. Спасибо камитуэль. 15.08.2014
  • Может быть, я пытаюсь решить эту проблему неправильным способом. По сути, я хочу отправлять счета клиентам веб-приложения каждый квартал, то есть четыре установленные даты каждый год. Это должно быть сделано автоматически. Если это сложно, я мог бы просто отказаться от всей этой функции и просто добавить кнопку в моем представлении суперадминистратора, которая отправляет эти счета... НО мне все еще нужно планирование, потому что приложение представляет собой своего рода очередь, в которой клиенты могут устанавливать напоминания. , и время от времени они определенно будут длиннее 25 дней. 15.08.2014
  • @AndersÖstman, в этом случае система cron кажется более подходящей. Почему? 1) он стабилен, широко используется 2) он выдержит сбои и перезапуски вашего приложения 3) он автоматически запускается при загрузке сервера, поэтому он выдержит сбой и перезагрузку сервера. Вы должны использовать следующее правило cron: 0 0 1 */3 * node /send-invoices.js - это будет отправлять счета в полночь первого дня каждого третьего месяца. Подробнее см. man 5 crontab. 15.08.2014
  • Да, но когда приложение работает, будет создано больше напоминаний... Легко ли разрешить моему приложению связываться с системным cron для вставки большего количества событий? 15.08.2014
  • @AndersÖstman Системный cron будет выполнять только командный узел send-invoices.js Вся логика и кому/как отправлять будут выполняться внутри вашего send-invoices.js. 15.08.2014

  • 2

    повестка дня также удовлетворит ваши потребности. Он сохраняет время запланированных заданий в базе данных, а затем опрашивает базу данных с заданным интервалом (agenda.processEvery) в поисках заданий, которые необходимо выполнить.

    Полное раскрытие, я автор повестки дня.

    15.08.2014
  • Недавно я написал комментарий в блоге о повестке дня, настройке проекта и структуре проекта goo.gl/5sCNBM. 25.10.2014
  • Новые материалы

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.

    Получение стоковых обновлений с помощью Python
    Для начинающего финансового аналитика Введение Описание: Этот проект Python создает скрипт для получения текущих обновлений акций с финансового веб-сайта Yahoo. Для этого проекта мы..