2016-07-08 14 views
7

Ho iniziato a leggere la documentazione di Hangfire e non ho trovato nulla sulle limitazioni delle attività.Limitazioni delle attività pianificate (o in che modo viene implementata la persistenza delle attività)?

Come dichiarato, le attività (o lavori) sono memorizzate da qualche parte.

Poiché sono solo delegati, l'unica cosa che può essere memorizzata, per quanto ho capito, è un "corpo" delegato (IL?). Ma potrebbero esserci delle chiusure che forniscono alcuni contesti per l'attività, ad esempio alcuni servizi esterni, che possono richiedere il caricamento di ulteriori assembly per eseguire il loro codice, ecc.

In che modo Hangfire si occupa di questo?
L'attività può contenere istruzioni nel suo corpo o esistono dei limiti?

risposta

1

Quando si crea un lavoro, si chiama Job.FromExpression, se si passa a qualcosa di diverso da un'espressione di chiamata di metodo viene generata un'eccezione. Quindi l'unica cosa che puoi passare a BackgroundJob.Enqueue è una singola riga in cui quella linea chiama una funzione.

Quindi serializza il tipo di oggetto e tutti i parametri passati in JSON utilizzando JobHelper.ToJson. Quando si passa in un'istanza di una classe l'istanza non è serializzata, solo il tipo è, se l'esecuzione supera i limiti del processo, perderà lo stato interno.

Si consiglia di leggere su l'articolo del blog sul sito blog vecchio hangfire "Are your methods ready to run in background?"

+0

Grazie per la risposta e l'articolo di riferimento! Penso, ho la mia spiegazione, e la conclusione è che i metodi di lavoro/compito sono * molto * limitati dal loro contenuto. È necessario passare ** tutto ** lo stato, richiesto per eseguire il lavoro. Se uno ha bisogno di uno stato dinamico, deve recuperarlo dallo stato, che è stato serializzato sulla pianificazione del lavoro (ad esempio, passare l'identificatore del record nel database o il nome del file/percorso). Sono un po 'deluso - queste sono cose molto importanti, che devono essere collocate in cima alla home page di Hangfire. – Dennis

0

Sembra che il meccanismo sia basato su Expression per le operazioni di pianificazione e che la libreria sia destinata all'esecuzione "interna" (in corso) principalmente nei siti Web ASP.Net.

Significato, tutti gli assembly necessari per l'esecuzione di un'operazione pianificata devono essere già caricati nello spazio di memoria delle applicazioni Web, perché erano necessari per pianificare il lavoro (l'applicazione non sarebbe stata compilata se mancava un Type da un assembly che non è stato referenziato).

Spero che le cose diventino un po 'più chiare!

+0

"l'applicazione non avrebbero compilato se mancava un tipo da un assembly che non è stato fatto riferimento" - I significava carico dinamico dell'assemblaggio, ad es alcuni scenari basati su plugin, quando gli assembly plug-in esatti sono sconosciuti in fase di compilazione. – Dennis