Для этого вы должны использовать setTimeout()
и сохранить идентификатор таймера, который он возвращает, потому что вы можете использовать этот идентификатор таймера, чтобы отменить таймер. Для планирования таймера:
var timer = setTimeout(myFunc, 60 * 60 * 1000);
Затем, спустя некоторое время перед срабатыванием таймера, вы можете отменить таймер с:
clearTimeout(timer);
Если вы хотите, чтобы выжить после перезапуска сервера, то вам необходимо для сохранения фактического системного времени, которое вы хотите, чтобы таймер загорелся в каком-либо постоянном хранилище (например, файл конфигурации на диске или базе данных). Затем, когда ваш сервер запускается, вы читаете это значение из постоянного хранилища и, если оно установлено, вы устанавливаете новый setTimeout()
, который будет запускаться в это время. Аналогично, когда таймер срабатывает или когда вы очищаете таймер, потому что он вам больше не нужен, вы затем обновляете постоянный магазин, чтобы там не было будущего времени.
Вы можете сделать это достаточно чистым для использования, создав объект persistentTimer
, у которого был метод установки таймера, очистки таймера и инициализации из любого постоянного хранилища, которое вы используете при перезапуске сервера.
Если вы масштабируетесь на нескольких секундах, вам понадобится какой-либо агент, который координирует, какой сервер делает то, что предназначено для времени. Существует много разных возможных подходов, и поскольку вы подробно рассказали о том, что вы на самом деле делаете, трудно сделать конкретную рекомендацию. Вы можете использовать все задания cron на пользовательский сервер, который управляет рабочей очередью и передает задачи другим серверам, чтобы серверы могли получать рабочие элементы непосредственно из общей базы данных. – jfriend00
@ jfriend00 спасибо, просто нужно какое-то направление. Теперь смотришь в киэ. – timmyg13