2013-03-14 8 views
19

vorrei eseguire alcuni compiti normali client indipendente sullo sfondo di un'applicazione Meteor (come raschiare alcune pagine). Quindi non dovrebbero essere all'interno di alcun thread client, ma una volta che finiscono, vorrei aggiornare tutti i client con le informazioni. Qual è il modo migliore per raggiungere questo obiettivo?compiti di sfondo non connessi con qualsiasi client in Meteor

+0

Si prega di notare che non esiste una cosa come un "thread del client" a Meteor, contrariamente a soluzioni più tradizionali. Le richieste client vengono elaborate in modo asincrono, non multi-thread. –

+0

Hai ragione. Sono fibre, un multi-tasking cooperativo. – Mitar

risposta

5

Per fare questo in modo da consentire processi esterni arbitrari aggiornano i client Meteor, usa il protocollo DDP che è associato con Meteor. I processi del tuo server possono scrivere sul canale DDP e quando aggiornano i tuoi clienti. Date un'occhiata a questo post per un esempio e un caso d'uso, che può essere simile al tuo:

Using node ddp-client to insert into a meteor collection from Node

Il protocollo è abbastanza semplice, e il post mostra un esempio di una scrittura processo node.js in una collezione Mongo che aggiorna i client in tempo reale.

+0

Ehm, hai ricollegato a questa domanda? – Mitar

+0

Gah - mi dispiace per quello. Appena risolto – mcauth

+0

Approccio interessante. – Mitar

6

loro Eseguire sul vostro codice lato server. Se con regolarità intendi attività a tempo o ogni giorno:

È possibile utilizzare un cron job con il pacchetto cron di Tom Coleman: https://github.com/tmeasday/meteor-cron.

Avrai bisogno di installare il meteorite package manager first: npm install meteorite -g e quindi installare il pacchetto cron nel progetto dir mrt add cron-tick

Server 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 
}); 

Non appena si esegue l'aggiornamento/inserimento/la modifica verrà inviata a tutti i client.

+0

C'è un modo per spingere qualcosa per i clienti che non si basa sulla raccolta (in modo da non basate su qualcosa nel database)? Ti piace solo l'informazione che qualcosa è stato fatto? Una notifica? – Mitar

+1

In quale thread viene eseguito questo cron job? – Mitar

+1

Il suo un po 'Tricker di quello, javascript nel nodo in un singolo thread, quindi questo è dove le fibre viene in. Se si utilizza un Meteor.call in cron per una meteora.metodo con il tuo compito contenente 'this.unblock' il contenuto nel metodo da' this.unblock' verrebbe eseguito in una nuova fibra in modo da non bloccare altri client. Per quanto riguarda le altre cose che la meteora può inviare, ti consiglio la raccolta dei conteggi per camera: http://stackoverflow.com/questions/10565654/how-does-the-messages-count-example-in-meteor-docs-work un buon punto di partenza, dipende da cosa esattamente si vuole inviare. – Akshat

1

Si potrebbe provare a chiamare un Meteor.setInterval sul server (forse in Meteor.startup). Questo dovrebbe funzionare, anche se potrebbe non essere flessibile come la soluzione di cron.

+1

L'idea è che posso avere processi indipendenti, anche dividerli tra più server. Quindi, davvero, un sollevamento pesante su macchine da lavoro. – Mitar

0

Vai a http://atmospherejs.com e cercare cron

Il migliore che ho trovato è percolate:synced-cron

installazione

meteor add percolate:synced-cron

Basics

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(); 

avanzata

See their documentation

Problemi correlati