2009-06-19 4 views
8

Ho bisogno di offrire la pianificazione di azioni/eventi, nel nostro sito web. Un'analogia da schifo potrebbe essere un sistema di calendari, in cui una persona aggiunge un elemento del calendario e quando la data/ora è stata "colpita", allora viene attivata una logica (ad esempio calcola un rapporto).Come posso fare eventi basati su orari/pianificati in .NET?

Potrei avere centinaia e persino migliaia di eventi programmati inseriti dai miei clienti. Quando un cliente inserisce qualcosa per essere programmato, salverò queste informazioni nel database. Quindi suppongo che aggiungerò un evento/lavoro da qualche parte, che conterrà la chiave primaria della tabella del database. quando l'evento deve essere licenziato, prendo le informazioni dal db, quindi eseguo la logica. fatto.

Quali sono alcune soluzioni comuni per gestire questo?

Sto usando .NET 3.5 SP1. DB è Sql Server 2008. Tuttavia, l'interfaccia utente sarà supportata.

Non ero sicuro che le persone usassero MSMQ? O qualcosa di integrato nel server Sql? O qualche libreria open source (ad esempio Quartz.NET) con un servizio NT. Il server sarà Windows 2008 Standard Edition.

Inoltre - si prega di non utilizzare suggerimenti per un lavoro cron equivalente o qualsiasi script della riga di comando, ecc

Infine, e questo è un obiettivo secondario .. mi piacerebbe gettare questo su sopra azzurro per Shiz e risatine ... così è anche possibile? è solo un'idea di lista dei desideri. Preferirei farlo su una scatola dedicata se la soluzione è più semplice, che usare Azure.

applausi :)

edit: logica di processare quando è richiesto un evento per essere licenziato, sono processi in background. Nessuna interfaccia utente richiesta.

+0

@Pure: http://stackoverflow.com/questions/542804/asp-netbest-way-to-run-scheduled-sask-tasks –

+0

a quale ora possono pianificare gli eventi (secondo, minuto, 15 minuti, 30 minuti, all'ora, ecc.)? Di quanti utenti stiamo parlando qui? –

+0

La granularità del tempo è: anno/mese/giorno/ora/minuto. –

risposta

2

Quartz.NET probabilmente potrebbe anche gestire questi requisiti abbastanza bene. I vantaggi che vedo sono in vari modi di impostare lo scheduler (CronTrigger + calendari) e la possibilità di avere i lavori in piccole unità di codice verificabile (lavori).

Quartz.NET offre anche la distribuzione e il failover necessari con funzionalità di clustering. Una buona caratteristica è anche la configurazione configurabile per la gestione delle mancate manomissioni, che ti dà l'opportunità di reagire a mancate accensioni e al tempo di fermo del programmatore.

SQL Service Broker sembra avere il vantaggio di non eseguire il polling, mi chiedo se sarà comunque il problema, il broker ha lo svantaggio di sembrare un po 'complicato (almeno dalla descrizione che ho letto sopra).

Solo il mio parziale $ 0,02.

0

Dipende un po 'dalla natura del sistema. Lavorando dal presupposto che la definizione completa degli eventi è memorizzato nel database:

  • Se l'evento ha bisogno di provocare qualcosa in un'interfaccia utente Web, gli aggiornamenti controllare la tabella per le voci che sono 'successo' e aggiungere il appropriati indicatori visivi/schermate/popup alla prossima uscita di richiesta web.
  • Se gli eventi si riferiscono all'elaborazione in background, la soluzione più semplice è scrivere un'applicazione .NET stand-along separata che esegua il polling della tabella degli eventi del database per i nuovi record e controlli contro il tempo per vedere quali eventi si sono verificati. Puoi andare alla moda e coinvolgere il threading se alcuni eventi causano lunghi processi in esecuzione, ecc. Ma quello sarebbe il design di base. (Utilizza solo il threading se devi ... una semplice app a thread singolo che esegue il polling della tabella sarebbe più robusta)
1

Un'opzione potrebbe essere la creazione di un processo SQL da eseguire a prescindere dall'intervallo più granulare che hai è ed elaborando tutti i tuoi eventi allora.

Se si desidera il meglio dei mondi .NET e SQL Server, è possibile anche use SQL jobs and call managed code. Non ho alcuna esperienza con questa soluzione, quindi mi scuso in anticipo se la risorsa che ho fornito non è molto approfondita.

Se le attività sono molto complesse e non si desidera caricare gli assembly su SQL Server o semplicemente non piace il proprio sistema di pianificazione, si consiglia di un servizio Windows .NET con un plug-in di pianificazione di terze parti. Personalmente, se tutto il codice potesse essere conservato in una stored procedure o in una serie di stored procedure, farei un lavoro poiché penso che sia molto più facile da gestire e molto del lavoro è già stato fatto per te.

Modifica

Ho appena notato un commento che ha spiegato la granularità. Se si dispone di alcune azioni che devono essere eseguite ogni minuto, una soluzione del servizio .NET sarebbe probabilmente più semplice poiché probabilmente si dovrebbe implementare una sorta di soluzione multi-thread.

0

Quindi suppongo che aggiungerò un evento/lavoro da qualche parte, che conterrà la chiave primaria della tabella del database. quando l'evento deve essere licenziato, prendo le informazioni dal db, quindi eseguo la logica.

Non so quale sia la soluzione comune, ma, reinventando la ruota, mi piacerebbe creare un indice cluster di database sul tempo dell'evento, in modo da poter eseguire il polling del database ogni minuto con un'istruzione come. ..

SELECT * FROM Events WHERE Events.Time < next_minute 
1

stai andando avere bisogno di un job scheduler e un gestore di lavoro dal momento che si dispone di piccola granularità e devi capacità di conoscere a priori se tutti i lavori che si verificano in un dato momento si concluderà dal il prossimo minuto.

Ciò semplifica il lavoro dello scheduler. Dovresti avere una tabella DB che memorizza i tuoi lavori e ogni minuto avere un servizio di pianificazione lavoro andare su quella tabella e selezionare i lavori che devono essere eseguiti.

Accoderà quei lavori con un manager del lavoro. Potresti usare un'altra tabella o una coda transazionale per accodare il tuo lavoro. Il tuo servizio di gestione dei lavori monitorerà la coda dei lavori. È possibile eseguire il rollover o utilizzare BizTalk per monitorare la coda dei lavori e avviare un'orchestrazione o workflow. Estrae le attività dalla coda una alla volta, esegue le attività e aggiorna lo stato del lavoro nel DB.

Il problema sarà la scalabilità in base al numero di utenti, al numero di attività che accodano e all'intensità (tempo, memoria, CPU, ecc.) Di ciascuna attività. Se fossi in te, spingere indietro la granularità di 1 minuto e spingerla a 5 minuti. Cosa ti serve fare alle 13.38. che non puoi aspettare fino alle 1:40 pm per? :)

1

Questo è già un problema discusso su StackOverflow. Si prega di passare attraverso Need job scheduler in asp.net

Hai dimenticato di aggiungere il pezzo più essenziale di informazioni nella tua domanda - ASP.Net

Esso descrive un quadro di pianificazione per ASP.NET applicazioni web che può essere eseguito come un servizio e vi darò un metodo che viene chiamato periodicamente e quindi è possibile attivare la logica per caricare gli eventi, accodare quelli validi utilizzando i timer.

Inoltre, questo è il più economico di tutte le alternative. Spero che questo sia ciò di cui avevi bisogno.

+0

No: non ho bisogno di un job scheduler in _ASP.NET_. Inoltre, ho letto quel post di stackoverflow _blog_ che tutti quei post SO finiscono per portare a. Leggi i commenti -> non è affatto una buona soluzione per le app aziendali. Una piccola app, certo. Quindi no, no, amico. –

+0

Se si sta cercando una soluzione standard per enterprsie, andare su server Web dedicati e si possono avere un paio di soluzioni possibili come .Net. Servizio di servizio remoto per scheduler o SQL Server in hosting .Net scheduler ecc. – MSIL

4

Workflow Foundation può fare questo. Utilizzare un Delay activity, impostare TimeSpan su (DesiredTimeOfExecution - Now). Per i sistemi su più ampia scala, impostare UnloadOnIdle su true e i flussi di lavoro in sospeso verranno mantenuti fino a quando necessario.

Ecco il numero a very simple example of the Delay Activity.

WF è gratuito, incluso come parte di .NET Framework 3.0.

+1

E 100% ricondizionato e riscritto (incompatibile) da zero in 4.0 – dkretz

+0

@le dorfier: ehm ... cosa hai appena detto? quel commento non ha senso ??? :( –

+0

@Cheeso: con WF, questo può gestire un sacco di attività contemporaneamente, come migliaia e decine di migliaia? In secondo luogo, cosa succede se il server Web viene riciclato/riavviato? In terzo luogo, può essere utilizzato in un web scenario agricolo? –

2

Quello che si desidera è SQL Server Service Broker.

È possibile eseguire l'accesso al database temporizzato per eseguire query sui dati del calendario, ecc. È basato su messaggistica, più potente di MSMQ, non richiede il polling e può essere utilizzato in ambienti distribuiti se è ciò di cui si ha bisogno. Funziona alla grande per me!

Ti verrà inviata una stored procedure per inserire le informazioni sull'evento in una coda SSB nel db. Darai a quel messaggio un tempo in futuro per svegliarti ed elaborare un'altra stored procedure che cattura i dati degli eventi e inserisce una coda di ritiro che esegue una "attivazione esterna". EA invia una notifica a un servizio Windows che punta a un'app console. Quella app per console cattura le informazioni sull'evento dalla coda di ritiro. Ora hai i dati degli eventi nel momento preciso in cui lo vuoi. Elabora come preferisci nell'app della console.

C'è una curva di apprendimento, ma ne vale la pena se avete bisogno dell'affidabilità, della flessibilità e della scalabilità offerte da SQL Service Broker. Di seguito sono riportati alcuni link per iniziare.

Ecco un confronto: SQL Service Broker vs. MSMQ

così sarebbe solo mi permette di postare un collegamento purtroppo. Altrimenti potrei indicarti più risorse per aiutarti a iniziare con SSB.

Spero che questo aiuti!

+0

finora ..cercherò di esaminare questo servizio di brokeraggio. Sembra molto promettente. altri link sarebbero fantastici! forse in alcuni commenti, qui? –

+0

Ecco una grande fonte di bulloni e bulloni http://rusanu.com/articles/ Anche ottenere questo libro: http: //bit.ly/SAm9m Ecco un confronto: SQL Service Broker vs MSMQ –

+0

Hai dimenticato l'ultimo collegamento : http://www.devx.com/dbzone/Article/34110 –