Як програмно контролювати давно запущену програму


11

Що я зараз маю, можна підсумувати цим псевдокодом:

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)
}

Ця програма просто налаштована на наш сервер як заплановане завдання. Ми володіємо програмою і можемо робити з нею все, що хочемо. Моє запитання випливає з блогу щодо автоматизованих перевірок моніторингу (у мене немає зручного посилання).

Тож це змусило мене задуматися: Як у світі я можу змінити свою програму, щоб я міг запустити ще одну програму моніторингу? Або це має змінитись від того, щоб бути консольною програмою, щоб сказати, що прихована програма WPF ?

В цілому, я вважаю за краще мати змогу просто запустити програму на своєму комп’ютері, яка перевіряє хід програми через мережу, тому мені не доведеться RDP на сервер, щоб перевірити його стан (але це не було б бути кінцем світу).

В цілому, я вважаю, що я хотів би побачити вікно, в якому написано щось на зразок: Обробити x до y, обробляються наступні елементи. Перерахуйте елементи, як-от таблицю, і скажіть, як "Завантаження" або "Чекаю на відповідь". Можливо, якщо я з’їду з розуму, я міг би також зробити чергу чергових невдалих предметів (але це було б просто зайвим).

Мій розум продовжує схилятися до події, але я не можу зрозуміти, як би я запустив програму, яка може передплатити і скасувати підписку на запущену програму. Це навіть можливо?


Ви хочете стежити за ходом операцій завантаження / відповіді (тривалістю 10 хвилин) чи хочете дізнатися, скільки завантажень відбулося в циклі "Parallel.ForEach"?
Док Браун

@DocBrown див. Редагувати. (останні два абзаци)
Роберт Снайдер

1
Мені здається, що ви хочете, можливо, це проста програма UDP-приймача. Ви можете скидати пакети статусу в мережу, і якщо немає нічого, щоб їх отримати, не буде завдано ніякої шкоди.
Роберт Харві

Відповіді:


7

Вам потрібен спосіб спілкування між вашими програмами, який не пов'язує їх один з одним. Існує декілька способів зробити це, ви можете мати завдання записати у файл і слідкувати за читанням з файлу, зробити завдання доступним через WCF, щоб монітор міг «опитуватись» на зміни, користуватися мережею ...

Щоб уникнути винаходиння колеса, погляньте на цілі реєстрації журналу log4net Якби я реалізував щось подібне, я б, ймовірно, використовував log4net та log в UDP або Telnet і мав монітор на іншому кінці підключитися до нього. log4net піклується про все для вас, в тому числі не викидаючи винятки, коли монітор не активований.


Я думаю, що я з цим питанням відповідаю, тому що ми вже добре використовуємо log4net .. ведення журналів :) Так що це чудово би відповідало тому, що він має. У мене не було поняття log4net, який міг би це зробити! Дякую
Роберт Снайдер

9

З ваших коментарів я бачу, що у вас є база даних клієнт / сервер, і ви завантажувач вже має з’єднання та доступ до запису? Тоді, мабуть, було б найпростіше додати до бази даних таблицю "моніторинг" або "статус" і дозволити завантажувачу звітувати про свій прогрес там (запишіть туди кожен "цікавий" крок, мабуть, 5 кроків, перелічених вище).

Щоб переглянути стан, створіть другу програму з графічним інтерфейсом, яка підключається до бази даних та відображає стан (наприклад, опитуванням з інтервалом у 1 хвилину). Ви можете запустити цю програму на своєму локальному робочому столі, припускаючи, що звідти можливо підключитися до бази даних.

Звичайно, коли запис у таблицю стану перешкоджає транзакціям вашої бази даних, ви можете використовувати окреме з'єднання. Ви також можете використовувати механізм черги повідомлень, як MSQM , але це може бути великим рішенням для вашого простого випадку.


+1 Це найкращий підхід до простоти і не надто ускладнення того, що не повинно бути занадто складним.
Томас Стрінгер

3

Просто для того, щоб спиратися на відповідь @ JDT, поширеним способом цього є написання повідомлень у чергу повідомлень. Щоразу, коли у вашій програмі трапляється щось важливе, воно пише повідомлення та надсилає його до черги повідомлень. Зазвичай формат повідомлення XML або подібний. Це черга письменника.

Програма моніторингу зчитує (зчитувач черги) черги та вибирає повідомлення та обробляє їх, зберігаючи їх та аналізуючи повідомлення проти попередніх повідомлень або умов. Якщо умова виконана, програма моніторингу підніме попередження, що вказує на потенційну проблему.

Це скасовує вашу програму від моніторингу, оскільки вона лише відпускає повідомлення. Додаток для моніторингу визначає, коли на основі поточних повідомлень сталося щось добре чи погане. Черги використовуються, оскільки вони пропонують хороший спосіб зберігати повідомлення без втрат.

Ви хочете централізувати обмін повідомленнями, якщо працює кілька примірників вашої програми. Якщо є лише 1 екземпляр, то використання інших сховищ, таких як журнал подій Windows або файл, може бути достатнім.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.