Il modo migliore per elaborare una coda in C # (trattamento PDF)

1

Prima di tutto lasciami esporre ciò che vorrei fare: dispongo già di una webapp di vecchia data sviluppata in ASP.NET (C #) 2.0. In questa app, gli utenti possono caricare file PDF standard (testo + foto). L'app è in esecuzione in produzione su Windows Server 2003 e ha un server database dedicato (SQL server 2008) che esegue anche Windows Server 2003. Io stesso sono uno sviluppatore web abbastanza esperto, ma non ho mai programmato qualcosa di non-web (o almeno niente grave).

Ho intenzione di aggiungere una funzionalità alla webapp per cui avrei bisogno di un'istantanea jpg di ogni pagina del PDF. Creare queste "miniature" non è un grosso problema in quanto tale, lo faccio già all'interno della mia webapp usando ghostscript. Per ora l'ho fatto solo su documenti di 1 pagina, e la nuova funzionalità dovrà elaborare documenti più grandi. Affinché questo processo sia trasparente anche per gli amministratori come utenti finali, vorrei implementare un qualche tipo di coda per ritardare l'elaborazione delle miniature. Ancora una volta, nessun problema per creare la coda, sarà costituito da record in una tabella, con informazioni sufficienti per trovare il documento pdf indietro.

Quindi avrò bisogno di elaborare questa coda, e questo è stato il mio interrogatorio iniziare. Ovviamente la migliore soluzione per elaborarlo non è uno script ASP o così, quindi dovrò uscire dal mio ambiente conosciuto. Nessun problema, ma non ho idea di quale direzione andare. Pertanto, alcune domande:

  • Che cosa dovrei sviluppare? Probabilmente ho bisogno di qualcosa che è "standby" sul server, viene eseguito quando necessario, quindi ritorna in stato di attesa fino a nuovo avviso. Dovrei controllare il servizio di Windows? Esiste un altro tipo di progetto più appropriato?

  • A seconda della prima risposta, quale sarà l'approccio? Dovrei avere in qualche modo SQL server "dire" al programma / servizio / ... per elaborare la coda, o dovrei avere quel programma / servizio / ... controllare periodicamente lo stato della coda e trattare nuovi elementi. In entrambi i casi, quale funzionalità posso usare?

  • non stiamo parlando di centinaia di PDF al giorno (max 50 forse), posso totalmente permettermi di trattare la coda 1 alla volta. Puoi confermare che non devo guardare molto oltre i thread e così? (Ho trovato molte risposte parlando di thread nel trattamento in coda, ma sembra abbastanza esagerato per le mie esigenze)

  • Forse collegato alla domanda precedente: che dire della chiamata simultanea al programma, qualunque essa sia? Supponiamo che sia attualmente in esecuzione e che un nuovo record arrivi in coda, quale dovrebbe essere il comportamento?

Non ho bisogno di risposte molto dettagliate e sarei già soddisfatto di risposte come "È possibile eseguire l'elaborazione con un servizio, e sì è possibile avere sqlserver sulla macchina Un trigger di avvio di un servizio sulla macchina B" o "Tu Devo sviluppare xxx e quindi utilizzare lo scheduler per eseguirlo ogni xxx minuti ". Non mi interessa leggere articoli e così, ma non posso permettermi di passare troppo tempo ad imparare cose per rendermi finalmente conto che sono andato nel modo sbagliato per questo progetto, quindi in pratica sto cercando di restringere la portata delle cose che devo indagare.

Grazie per avermi letto, spero di trovare un po 'di aiuto qui: -)

    
posta Laurent S. 30.08.2013 - 17:04
fonte

3 risposte

3

Le tue esigenze sono piuttosto miti, quindi puoi permetterti di scrivere una soluzione molto semplice / facile da gestire.

Nel tuo caso probabilmente scriverei un'app console & avviarlo tramite l'utilità di pianificazione. L'app dovrebbe leggere la "coda", elaborare le richieste esistenti e quindi uscire. Potresti programmarlo per eseguire ogni 5 - 10 minuti circa. L'aggiornamento del codice è semplice: sovrascrivi il file tra le esecuzioni pianificate.

Potresti anche utilizzare un servizio Windows (usando TopShelf per esempio) - sono abbastanza facili da scrivere, ma poi invece di uscendo una volta finito avresti bisogno di dormire. L'installazione di una nuova versione diventa un po 'più fastidiosa di un'app per console, ma non di molto.

Se inizi a guardare volumi più elevati, alla fine vorresti eliminare il polling e probabilmente spostare la coda fuori dal database & in qualcos'altro (ho sentimenti contrastanti su MSMQ)

    
risposta data 30.08.2013 - 17:26
fonte
3

L'utilizzo di app console C # eseguite dall'Utilità di pianificazione di Windows è un modo semplicissimo di fare ciò e offre vantaggi enormi in un'implementazione semplice, problemi ridotti da eventuali perdite di memoria, oltre a risparmiare molta energia dal non reinventare ancora un altro schedulatore.

    
risposta data 03.11.2013 - 23:05
fonte
1

Hai alcune opzioni diverse -

  1. Avvia un processo / thread separato dal codice ASP.NET per eseguire il lavoro. Vorrei non consigliare questo approccio, avrai problemi con i processi ghost, IIS che termina le cose per te, problemi di sicurezza degli account degli utenti, ecc.

  2. Un'applicazione per console di Windows che si esegue periodicamente con l'utilità di pianificazione di Windows. Bello, semplice, facile da mantenere e distribuire, facile da testare. È facile per qualcun altro capire cosa hai fatto: possono accedere alla tua casella di produzione e vedere l'operazione pianificata. L'app controlla il DB per quale lavoro deve essere fatto, lo fa, registra i dati su disco (o anche meglio il tuo DB, o forse anche il registro degli eventi se hai un buon amministratore di sistema) e poi esiste. Vorrei scendere su questa strada per il momento. Puoi sempre inserire il tuo codice in una DLL e "aggiornarlo" all'opzione successiva ...

  3. Un'applicazione di servizio Windows. L'approccio alla bomba nucleare. Buono se ne hai bisogno per eseguire più spesso come ogni minuto o così. Se si desidera evitare il polling del DB, è possibile farlo aprire un endpoint WCF e parlarne direttamente. Ho già fatto questo approccio e funziona alla grande, ma probabilmente è eccessivo.

risposta data 04.11.2013 - 00:20
fonte

Leggi altre domande sui tag