Я хотел бы запустить некоторые независимые от клиента обычные задачи на фоне приложения Meteor (например, соскабливание некоторых страниц). Поэтому они не должны находиться внутри какого-либо клиентского потока, но как только они заканчиваются, я хотел бы обновить все клиенты информацией. Каков наилучший способ достичь этого?
Фоновые задачи, не связанные с каким-либо клиентом в Meteor
Ответ 1
Чтобы сделать это таким образом, чтобы произвольные внешние процессы обновляли клиенты Meteor, используйте протокол DDP, связанный с Meteor. Процессы вашего сервера могут записываться на канал DDP, и когда они будут обновляться вашими клиентами. Взгляните на это сообщение для примера и прецедента, который может быть похож на ваш:
Использование node ddp-client для вставки в коллекцию метеор из Node
Протокол довольно прямолинейный, и сообщение показывает пример записи процесса node.js в коллекцию Mongo, которая обновляет клиентов в реальном времени.
Ответ 2
Запустите их на своем серверном коде. Если по регулярности вы имеете в виду заданные задачи каждый день или что-то еще:
Вы можете использовать работу cron с пакетом cron Tom Coleman: https://github.com/tmeasday/meteor-cron.
Вам нужно сначала установить менеджер пакетов метеорита: npm install meteorite -g
, а затем установить пакет cron в проект dir mrt add cron-tick
Сервер js
var MyCron = new Cron();
// this job will happen every day (60 seconds * 60 * 24)
MyCron.addJob(60*60*24, function() {
//Scrape your stuff
//Update your collections
});
Как только вы запустите свое обновление/вставку/редактирование, они будут перенаправлены всем клиентам.
Ответ 3
Вы можете попробовать называть Meteor.setInterval
на сервере (возможно, в Meteor.startup
). Это должно работать, хотя это может быть не так гибко, как решение cron.
Ответ 4
Перейдите в http://atmospherejs.com и выполните поиск cron
Лучший, который я нашел, - percolate: synced-cron
Установка
meteor add percolate:synced-cron
Основы
SyncedCron.add({
name: 'Crunch some important numbers for the marketing department',
schedule: function(parser) {
// parser is a later.parse object
return parser.text('every 2 hours');
},
job: function() {
var numbersCrunched = CrushSomeNumbers();
return numbersCrunched;
}
});
SyncedCron.start();
Дополнительно