MVC - Cykliczne wykonywanie kodu

0

Hej, załóżmy, że mam aplikacje, która zbiera linki do plików od użytkowników, zapisuje je w bazie, a później w nocy (albo np. co 20min/jeden) parsuje je, wyciąga dane i wprowadza do db - załóżmy, że proces trwa tyle, że ma to sens.

Albo np. co 1h robi

context.Users.ForEachAsync(x => x.money -= 100);

Zastanawiam się czy mam napisać do tego osobną aplikację czy dodać to jakoś niezbyt ładnie?

1

Ja bym to postawił jako Windows Service. Ewentualnie jako program który będzie odpalany za pomocą Windows Task Scheduler.

Polecam użyć Topshelf, świetny lekki framework do pisania programów które mogą być odpalane jako aplikacje konsolowe jak i instalowane jako serwisy. Pozwala pisać znacznie mniej kodu i nie bawić się w konfigurację serwisu własnoręcznie.

http://topshelf-project.com

4

w net mvc core 2.x masz IHostedService, więc można się obejść bez zewnętrznych aplikacji/frameworków:
https://www.stevejgordon.co.uk/asp-net-core-2-ihostedservice

2

Trochę poczytałem o propozycji podanej przez @neves i trzeba uważać- wystawienie aplikacji pod IIS nie gwarantuje ciągłego działania ponieważ IIS w celu optymalizacji może zamknąć nieużywaną aplikację do czasu aż przyjdzie kolejny request HTTP. O ile używanie IHostedService coś w tej materii zmienia (w co wątpię) to trzeba pamiętać żeby ustawić AlwaysRunning dla użytej AppPool. Poza tym z komentarzy w internecie wyczytałem że nadal mogą pojawiać się dziwaczne zachowania aplikacji, chociaż komentarze dotyczyły wystawiania zwykłych aplikacji pod IIS, a nie tych korzystających z IHostedService.

2

IHostedService nie powstrzymuje IIS przed zamknięciem aplikacji w przypadku braku aktywności, jedynie pozwala zareagować na event zamykania i daje nam bodaj maks 3 minuty jeśli dobrze pamiętam na reakcje. Trzeba też pamiętać że aplikacja nie tylko jest przez IIS zamykana w przypadku braku aktywności, ale także w przypadku ciągłej aktywności jest przeładowywana bodaj co 28h przy domyślnych ustawieniach, ale też można to zmienić.

Jeśli chodzi o zwykłe net mvc, to tam od wersji .NET 4.5.2 się pojawiło QueueBackgroundWorkItem do uruchamiania zadań w tle:
https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/

Od miesiąca używam IHostedService, do asynchronicznego rozsyłania emali w jednej małej aplikacji wewnątrz firmowej i nie miałem z tym żadnych problemów.

0
neves napisał(a):

w net mvc core 2.x masz IHostedService, więc można się obejść bez zewnętrznych aplikacji/frameworków:
https://www.stevejgordon.co.uk/asp-net-core-2-ihostedservice

IHostedService działa świetnie, używam tego dość mocno i nie mam problemów ani na IIS na windowsie, ani na nginx + kestrel na debianie. Świetnie się sprawdza do crono-podobnych zadań, ale też i do długich tasków, a nawet jako handler do message'y (messsage'ów?) z eventbusa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1