Jak programowo monitorować długo działający program

11

To, co obecnie mam, można podsumować za pomocą tego pseudo kodu:

public static void Main(string[] args)
{
    var listOfObjects = Database.GetObjectsToUploadToOnlineService();
    Parallel.ForEach(Upload)
}

private static void Upload(MyUploadObject obj)
{
    //Build object (takes a few milliseconds)
    //Format to JSON (takes a few more milliseconds)
    //Upload (can take up to a max of 10 minutes)
    //Wait for a response (can take up to a max of 10 minutes)
    //Save response to our database (takes a few milliseconds)
}

Ten program jest właśnie skonfigurowany na naszym serwerze jako zaplanowane zadanie. Jesteśmy właścicielem programu i możemy z nim robić, co chcemy. Moje pytanie pochodzi z bloga na temat przeprowadzania automatycznych kontroli monitorowania (nie mam przydatnego linku).

To sprawiło, że pomyślałem: jak, u licha, mogę zmodyfikować swój program, aby uruchomić inny program „monitorujący”? A może powinna to zmienić się z programu konsolowego na program ukryty WPF ?

Ogólnie wolałbym móc po prostu uruchomić program na moim komputerze, który sprawdza postęp programu przez sieć, więc nie muszę RDP na serwerze, aby sprawdzić jego status (ale nie zrobiłby tego być końcem świata).

Ogólnie rzecz biorąc, sądzę, że chciałbym zobaczyć okno, które mówi coś w stylu: Przetwarzaj x y jak dotąd, przetwarzane są następujące elementy. Wymień elementy w tabeli, na przykład „Prześlij” lub „Oczekiwanie na odpowiedź”. Może gdybym zwariował, mógłbym również zrobić kolejkę nieudanych przedmiotów (ale to byłoby dodatkowe).

Mój umysł wciąż skłania się ku zdarzeniu, ale nie mogę zrozumieć, jak uruchomiłbym program, który może subskrybować i wypisać się z uruchomionego programu. Czy to w ogóle możliwe?

Robert Snyder
źródło
Czy chcesz monitorować postępy w (10-minutowych) operacjach wysyłania / odpowiedzi, czy chcesz wiedzieć, ile przesłań miało miejsce w pętli „Parallel.ForEach”?
Doc Brown
@DocBrown patrz edycja. (dwa ostatnie akapity)
Robert Snyder
1
Brzmi dla mnie tak, jakbyś chciał być może prostym programem odbiornika UDP. Możesz upuścić pakiety statusu w sieci, a jeśli nie ma nic, co mogłoby je odebrać, nie wyrządziłoby to szkody.
Robert Harvey

Odpowiedzi:

7

Potrzebny jest sposób komunikacji między programami, który nie wiąże ich ze sobą. Istnieje wiele sposobów, aby to zrobić, możesz zapisać zadanie do pliku i monitorować odczyt z pliku, udostępnić zadanie przez WCF, aby monitor mógł „sondować” zmiany, korzystać z sieci ...

Aby uniknąć ponownego wynalezienia koła, spójrz na cele rejestrowania log4net. Gdybym zaimplementował coś takiego, prawdopodobnie użyłbym log4net i logowałby się do UDP lub Telnet i miałbym podłączyć monitor z drugiej strony. log4net dba o wszystko za Ciebie, w tym nie zgłasza wyjątków, gdy monitor nie jest aktywny.

JDT
źródło
Myślę, że jestem giong, aby przejść z tą odpowiedzią, ponieważ już używamy log4net do cóż ... rejestrowanie :) Więc to by ładnie pasowało do tego, co on ma. Nie miałem pojęcia, że ​​log4net może to zrobić! Dziękuję
Robert Snyder,
9

Z twoich komentarzy widzę, że masz dostęp do bazy danych klient / serwer, a twój przesyłający ma już połączenie i dostęp do zapisu? Wtedy prawdopodobnie najłatwiej byłoby dodać tabelę „monitorowania” lub „statusu” do bazy danych i pozwolić Twojemu przesyłającemu zgłosić tam swój postęp (zaloguj tam każdy „interesujący” krok, prawdopodobnie 5 kroków wymienionych powyżej).

Aby wyświetlić status, utwórz drugi program z GUI, który łączy się z bazą danych i wyświetla status (na przykład poprzez odpytywanie w odstępach 1 minuty). Możesz uruchomić ten program na lokalnym pulpicie, zakładając, że można stamtąd połączyć się z bazą danych.

Oczywiście, gdy zapisywanie w tabeli stanu zakłóca transakcje w bazie danych, możesz użyć osobnego połączenia. Możesz również użyć do tego mechanizmu kolejki komunikatów, takiego jak MSQM , ale może to być zbyt duże rozwiązanie dla Twojej prostej sprawy.

Doktor Brown
źródło
+1 To najlepsze podejście do uproszczenia i niezbyt skomplikowania czegoś, co nie powinno być zbyt skomplikowane.
Thomas Stringer
3

Aby skorzystać z odpowiedzi @ JDT, powszechnym sposobem na to jest pisanie wiadomości w kolejce komunikatów. Ilekroć w aplikacji dzieje się coś ważnego, pisze wiadomość i wysyła ją do kolejki wiadomości. Zazwyczaj format wiadomości to XML lub podobny. To pisarz kolejek.

Aplikacja monitorująca odczytuje (czytnik kolejek) kolejkę, wybiera wiadomości i przetwarza je, zapisując je i analizując w porównaniu z wcześniejszymi komunikatami lub warunkami. Jeśli warunek zostanie spełniony, aplikacja monitorująca wyświetli alert oznaczający potencjalny problem.

To oddziela Twoją aplikację od samego monitorowania, ponieważ po prostu odpala wiadomości. Do aplikacji monitorującej należy określenie, kiedy na podstawie bieżących komunikatów wydarzyło się coś dobrego lub złego. Kolejki są używane, ponieważ zapewniają dobry sposób przechowywania wiadomości bez utraty.

Chcesz scentralizowanego przesyłania wiadomości, jeśli działa wiele instancji aplikacji. Jeśli jest tylko 1 instancja, użycie innych sklepów, takich jak dziennik zdarzeń systemu Windows lub plik, może być wystarczające.

Jon Raynor
źródło