Dzisiaj zbudowaliśmy aplikację konsolową do uruchamiania zaplanowanych zadań dla naszej strony internetowej ASP.NET. Myślę jednak, że takie podejście jest nieco podatne na błędy i trudne do utrzymania. Jak wykonać zaplanowane zadanie (w środowisku Windows / IIS / ASP.NET)
Aktualizacja:
Przykłady zadań:
- Wysyłanie wiadomości e-mail z kolejki wiadomości e-mail w bazie danych
- Usuwanie nieaktualnych obiektów z bazy danych
- Pobieranie statystyk z Google AdWords i wypełnianie tabeli w bazie danych.
asp.net
windows
iis
scheduled-tasks
Niels Bosma
źródło
źródło
Odpowiedzi:
Wszystkie moje zadania (które należy zaplanować) dla strony internetowej są przechowywane na stronie internetowej i wywoływane ze specjalnej strony. Potem napisałem prostą usługę Windows, która tak często nazywa tę stronę. Po uruchomieniu strony zwraca wartość. Jeśli wiem, że jest więcej do zrobienia, od razu uruchamiam stronę, w przeciwnym razie uruchamiam ją za chwilę. Działa to dla mnie naprawdę dobrze i zachowuje całą logikę moich zadań w kodzie internetowym. Przed napisaniem prostej usługi Windows korzystałem z harmonogramu Windows, aby wywoływać stronę co x minut.
Innym wygodnym sposobem na uruchomienie tego jest skorzystanie z usługi monitorowania, takiej jak Pingdom . Skieruj ich sprawdzenie http na stronę, na której działa Twój kod usługi. Niech strona zwraca wyniki, które następnie mogą zostać użyte do uruchomienia Pingdom w celu wysyłania komunikatów ostrzegawczych, gdy coś jest nie tak.
źródło
Ta technika autorstwa Jeffa Atwooda dla Stackoverflow jest najprostszą metodą, na jaką się natknąłem. Opiera się on na mechanizmie zwrotnym „usunięto element pamięci podręcznej” wbudowanym w system pamięci podręcznej programu ASP.NET
Aktualizacja: Stackoverflow przerósł tę metodę. Działa tylko podczas działania strony, ale jest to bardzo prosta technika, która jest przydatna dla wielu osób.
Sprawdź także Quartz.NET
źródło
No, we’ve switched to a dedicated task. We definitely outgrew this technique. I do think it’s fine for small sites though!
- Jeff AtwoodUtwórz niestandardową usługę systemu Windows .
Miałem kilka krytycznych zadań skonfigurowanych jako zaplanowane aplikacje konsolowe i miałem trudności z utrzymaniem. Utworzyłem usługę systemu Windows z „pulsem”, która sprawdzałaby harmonogram w mojej bazie danych co kilka minut. Wyszło naprawdę dobrze.
Mimo to nadal używam zaplanowanych aplikacji konsolowych do większości niekrytycznych zadań konserwacyjnych. Jeśli nie jest zepsuty, nie naprawiaj go.
źródło
Dla wszystkich zaangażowanych było to łatwe:
Korzystając z tej metodologii, cała logika biznesowa jest zawarta w Twojej aplikacji internetowej, ale masz pewność, że menedżer zadań systemu Windows lub dowolny inny menedżer zadań komercyjnych uruchomi go i zarejestruje wszelkie informacje zwrotne, takie jak raport z wykonania. Korzystanie z usługi internetowej zamiast publikowania na stronie ma pewną zaletę, ponieważ łatwiej jest uzyskać dane zwrotne z usługi internetowej.
źródło
Po co wymyślać koło ponownie, użyj klasy Gwintowanie i Timer.
źródło
Użyj Windows Scheduler, aby uruchomić stronę internetową.
Aby zapobiec złośliwemu działaniu pająka użytkownika lub wyszukiwarki, aby go uruchomić, po skonfigurowaniu zaplanowanego zadania wystarczy wywołać stronę internetową za pomocą kwerendy, tj .: mypage.aspx? From = scheduletask
Następnie podczas ładowania strony użyj warunku: if (Request.Querystring ["from"] == "scheduletask") {// executetask}
W ten sposób żaden pająk wyszukiwarki lub złośliwy użytkownik nie będzie w stanie wykonać zaplanowanego zadania.
źródło
Request.IsLocal
>> tylko sam serwer może uruchamiać zaplanowane zadania, nikt inny.Ta biblioteka działa jak urok http://www.codeproject.com/KB/cs/tsnewlib.aspx
Umożliwia zarządzanie zaplanowanymi zadaniami systemu Windows bezpośrednio za pomocą kodu .NET.
źródło
Dodatkowo, jeśli twoja aplikacja korzysta z SQL SERVER, możesz użyć SQL Agent do zaplanowania swoich zadań. W tym miejscu zwykle umieszczamy powtarzający się kod oparty na danych (przypomnienia e-mail, zaplanowana konserwacja, czyszczenie itp.). Świetną funkcją wbudowaną w SQL Agenta są opcje powiadamiania o awariach, które mogą ostrzegać w przypadku niepowodzenia zadania krytycznego.
źródło
Nie jestem pewien, jakie masz na myśli zaplanowane zadania. Jeśli masz na myśli zadania typu „co godzinę, odśwież plik foo.xml”, skorzystaj z systemu Windows Zaplanowane zadania. (Polecenie „at” lub za pośrednictwem kontrolera). Niech uruchomi aplikację konsolową lub poprosi o specjalną stronę rozpoczynającą proces.
Edycja: powinienem dodać, to jest OK sposób na uruchomienie aplikacji IIS również w zaplanowanych punktach. Załóżmy więc, że chcesz sprawdzać swoją bazę danych co 30 minut i wysyłać użytkownikom przypomnienia e-mailem o niektórych danych, możesz użyć zaplanowanych zadań, aby poprosić o tę stronę, a tym samym uzyskać IIS.
Jeśli Twoje potrzeby są bardziej złożone, możesz rozważyć utworzenie usługi systemu Windows i uruchomienie jej w pętli w celu wykonania dowolnego potrzebnego przetwarzania. Ma to również tę zaletę, że wyodrębnia kod do celów skalowania lub zarządzania. Z drugiej strony musisz poradzić sobie z usługami Windows.
źródło
Jeśli jesteś właścicielem serwera, powinieneś użyć harmonogramu zadań Windows. Użyj AT /? z wiersza poleceń, aby wyświetlić opcje.
W przeciwnym razie ze środowiska internetowego może być konieczne wykonanie czegoś nieprzyjemnego, na przykład skonfigurowanie innego komputera w celu wysyłania żądań do określonej strony w określonych odstępach czasu.
źródło
Z powodzeniem korzystałem z Abidara w projekcie ASP.NET (oto kilka podstawowych informacji ).
Jedynym problemem związanym z tą metodą jest to, że zadania nie zostaną uruchomione, jeśli aplikacja sieci Web ASP.NET zostanie zwolniona z pamięci (tj. Z powodu niskiego zużycia). Jedną rzeczą, którą próbowałem, jest tworzenie zadania, aby uderzać w aplikację internetową co 5 minut, utrzymując ją przy życiu, ale nie wydawało się to działać niezawodnie, więc teraz używam do tego harmonogramu Windows i podstawowej aplikacji konsoli.
Idealnym rozwiązaniem jest utworzenie usługi systemu Windows, choć może to nie być możliwe (np. Jeśli korzystasz ze współdzielonego środowiska hostingowego). Ułatwia to także utrzymanie aplikacji w sieci z punktu widzenia konserwacji.
źródło
Oto inny sposób:
1) Utwórz skrypt internetowy „bicie serca”, który będzie odpowiedzialny za uruchamianie zadań, jeśli są one należne lub zaległe do uruchomienia.
2) Utwórz gdzieś zaplanowany proces (najlepiej na tym samym serwerze), który uderzy w skrypt i zmusi go do działania w regularnych odstępach czasu. (np. zadanie harmonogramu systemu Windows, które po cichu uruchamia skrypt Heatbeat za pomocą IE lub co chcesz)
Fakt, że kod zadania jest zawarty w skrypcie internetowym, służy wyłącznie utrzymaniu kodu w bazie kodu aplikacji internetowej (założono, że oba są od siebie zależne), co byłoby łatwiejsze dla programistów stron internetowych do zarządzania .
Alternatywnym podejściem jest utworzenie skryptu / programu serwera wykonawczego, który sam wykonuje cały harmonogram i uruchamia sam plik wykonywalny jako zaplanowane zadanie. Może to pozwolić na zasadnicze oddzielenie aplikacji sieciowej od zaplanowanego zadania. Dlatego jeśli chcesz, aby zaplanowane zadania działały nawet wtedy, gdy aplikacja / baza danych mogła być niedostępna lub niedostępna, powinieneś zastosować to podejście.
źródło
Za pomocą metody „ThreadPool.RegisterWaitForSingleObject” można łatwo utworzyć usługę Windows, która uruchamia kod w odstępach czasu. Konfiguracja jest bardzo prosta i łatwa. Ta metoda jest bardziej uproszczona niż użycie dowolnego z timerów w ramach.
Aby uzyskać więcej informacji, zobacz poniższy link:
Uruchamianie procesu okresowego w .NET przy użyciu usługi Windows:
http://allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html
źródło
Korzystamy również z aplikacji konsolowych. Jeśli korzystasz z narzędzi do rejestrowania, takich jak Log4net, możesz odpowiednio monitorować ich wykonanie. Nie jestem też pewien, w jaki sposób są trudniejsze w utrzymaniu niż strona internetowa, biorąc pod uwagę, że możesz udostępniać niektóre z tych samych bibliotek kodów między tymi dwoma, jeśli są one odpowiednio zaprojektowane.
Jeśli sprzeciwisz się uruchamianiu tych zadań na czas, w sekcji administracyjnej witryny internetowej może znajdować się strona internetowa, która działa jak kolejka. Użytkownik wysyła żądanie uruchomienia zadania, z kolei wstawia pusty rekord datestampu w tabeli MyProcessQueue, a zaplanowane zadanie sprawdza co X minut nowy rekord w MyProcessQueue. W ten sposób działa tylko wtedy, gdy klient chce, aby to działało.
Mam nadzieję, że te sugestie pomogą.
źródło
Jedną z opcji byłoby skonfigurowanie usługi systemu Windows i wywołanie zaplanowanego zadania.
W winformach, w których używałem Timerów, nie sądzę, że to zadziała dobrze w ASP.NET
źródło
Nowa biblioteka klas harmonogramu zadań dla platformy .NET
Uwaga: Od czasu utworzenia tej biblioteki Microsoft wprowadził nowy harmonogram zadań (Task Scheduler 2.0) dla systemu Windows Vista. Ta biblioteka jest opakowaniem dla interfejsu Task Scheduler 1.0, który jest nadal dostępny w systemie Vista i jest kompatybilny z Windows XP, Windows Server 2003 i Windows 2000.
http://www.codeproject.com/KB/cs/tsnewlib.aspx
źródło