2016-07-08 15 views
7

Zacząłem czytać dokumentację Hangfire i nie znalazłem nic o ograniczeniach zadań.Zaplanowane ograniczenia zadań (lub sposób implementacji trwałości zadań)?

Zadeklarowane zadania (lub zadania) są gdzieś przechowywane.

Ponieważ są tylko delegatami, jedyną rzeczą, którą można przechowywać, o ile rozumiem, jest delegat "ciało" (IL?). Możliwe są jednak zamknięcia, które zapewniają pewien kontekst dla zadania, np. Niektóre usługi zewnętrzne, które mogą wymagać załadowania dodatkowych zespołów w celu uruchomienia ich kodu itp.

W jaki sposób Hangfire się z tym wiąże?
Czy zadanie może zawierać instrukcje w swoim ciele, czy są jakieś ograniczenia?

Odpowiedz

1

Podczas tworzenia zadania wywołuje Job.FromExpression, jeśli przekazane zostanie coś innego niż wyrażenie wywołania metody, zgłasza wyjątek. Tak więc jedyną rzeczą, którą można przekazać do BackgroundJob.Enqueue jest pojedyncza linia, w której ta linia wywołuje funkcję.

Następnie serializuje typ obiektu i wszystkie przekazywane parametry w JSON przy użyciu JobHelper.ToJson. Kiedy przekazujesz instancję klasy, instancja nie jest serializowana, tylko typ jest, jeśli wykonanie przekroczy granice procesu, straci stan wewnętrzny.

Możesz przeczytać na blogu na blogu miejscu starego hangfire „Are your methods ready to run in background?

+0

Dziękuję za odpowiedź i cytowany artykuł! Myślę, że mam swoje wyjaśnienie i wniosek jest taki, że metody pracy/zadania są * bardzo * ograniczone przez ich treść. Należy przekazać stan ** all ** wymagany do wykonania zadania. Jeśli ktoś potrzebuje jakiegoś stanu dynamicznego, musi pobrać go ze stanu, który był serializowany w harmonogramie zadań (np. Identyfikator rekordu przebiegu w bazie danych lub nazwa pliku/ścieżka). Jestem trochę rozczarowany - to bardzo ważne rzeczy, które muszą być umieszczone na stronie głównej Hangfire. – Dennis

0

Wygląda na to, że mechanizm jest oparty na Expression dla operacji szeregowania, a biblioteka jest przeznaczona do "wewnętrznego" (w procesie) wykonywania głównie w witrynach ASP.Net.

Oznacza to, że wszystkie złożenia potrzebne do wykonania zaplanowanej operacji powinny być już załadowane do pamięci aplikacji WWW, ponieważ były potrzebne do zaplanowania zadania (aplikacja nie skompilowałaby się, gdyby brakowało Type z zespół, do którego nie odwołano się).

Mam nadzieję, że to sprawia, że ​​rzeczy stają się bardziej przejrzyste!

+0

„aplikacja nie byłby skompilowany gdyby brakowało typ z zespołu, że nie było odwołania” - I oznaczało dynamiczne ładowanie zespołu, np scenariusz oparty na wtyczce, gdy dokładne zestawy wtyczek są nieznane podczas kompilacji. – Dennis