Bagaimana memonitor program yang sudah berjalan lama secara programatik


11

Apa yang saya dapatkan saat ini dapat disimpulkan dengan kode semu ini:

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

Program ini baru diatur di server kami sebagai tugas yang dijadwalkan. Kami memiliki program dan dapat melakukan apa yang kami inginkan. Pertanyaan saya berasal dari sebuah blog tentang membuat pemeriksaan pemantauan otomatis (saya tidak punya tautan berguna).

Jadi itu membuat saya berpikir: Bagaimana saya bisa memodifikasi program saya sehingga saya bisa menjalankan program "pemantauan" yang lain? Atau haruskah ini berubah dari program konsol menjadi program WPF yang disembunyikan?

Secara keseluruhan, saya lebih suka menjalankan program di komputer saya yang memeriksa progres program melalui jaringan, jadi saya tidak perlu RDP ke server untuk memeriksa statusnya (tetapi tidak akan menjadi akhir dunia).

Secara keseluruhan, saya kira saya ingin melihat jendela yang mengatakan sesuatu seperti: Proses xy y sejauh ini, item berikut sedang diproses. Daftarkan item dalam, seperti, tabel dan minta mereka mengatakan seperti "Mengunggah" atau "Menunggu respons". Mungkin jika saya menjadi gila saya juga bisa bagaimana antrian barang gagal (tapi itu hanya akan menjadi tambahan).

Pikiran saya terus condong ke arah suatu peristiwa, tetapi saya tidak tahu bagaimana saya akan menjalankan program yang dapat berlangganan dan berhenti berlangganan ke program yang sedang berjalan. Apakah ini mungkin?


Apakah Anda ingin memantau kemajuan di dalam operasi pengunggahan / tanggapan (yang berlangsung 10 menit), atau apakah Anda ingin tahu berapa banyak unggahan yang telah terjadi di dalam loop "Parallel.ForEach"?
Doc Brown

@DocBrown lihat edit. (dua paragraf terakhir)
Robert Snyder

1
Kedengarannya seperti apa yang Anda inginkan mungkin adalah program penerima UDP sederhana. Anda dapat menjatuhkan paket status di jaringan, dan jika tidak ada yang menerimanya, tidak ada salahnya dilakukan.
Robert Harvey

Jawaban:


7

Yang Anda butuhkan adalah cara untuk berkomunikasi antara program Anda yang tidak mengikat mereka satu sama lain. Ada beberapa cara untuk melakukan ini, Anda bisa meminta tugas menulis ke file dan harus memantau membaca dari file, membuat tugas tersedia melalui WCF sehingga monitor dapat 'polling' untuk perubahan, gunakan jaringan ...

Untuk menghindari reinventing the wheel, lihat log4net target logging. Jika saya menerapkan sesuatu seperti ini saya mungkin akan menggunakan log4net dan login ke UDP atau Telnet dan monitor di ujung yang lain terhubung ke sana. log4net menangani semuanya untuk Anda, termasuk tidak melempar pengecualian ketika tidak ada monitor yang aktif.


Saya pikir saya akan pergi dengan jawaban ini karena kami sudah menggunakan log4net dengan baik .. logging :) Jadi ini akan cocok dengan apa yang dia miliki. Saya tidak punya petunjuk log4net bisa melakukan ini! Terima kasih
Robert Snyder

9

Dari komentar Anda, saya melihat Anda memiliki database klien / server yang tersedia, dan Anda pengunggah sudah memiliki koneksi dan akses tulis? Maka mungkin akan lebih mudah untuk menambahkan tabel "pemantauan" atau "status" ke database dan biarkan pengunggah Anda melaporkan perkembangannya di sana (catat setiap langkah "menarik" di sana, mungkin 5 langkah yang Anda daftarkan di atas).

Untuk melihat status, buat program kedua dengan GUI, yang menghubungkan ke database dan menampilkan status (misalnya, dengan polling dalam interval 1 menit). Anda dapat menjalankan program itu di desktop lokal Anda, dengan asumsi dimungkinkan untuk terhubung ke database dari sana.

Tentu saja, ketika menulis ke tabel status mengganggu transaksi database Anda, Anda mungkin menggunakan koneksi terpisah. Anda juga dapat menggunakan mekanisme antrian pesan seperti MSQM untuk itu, tetapi itu mungkin solusi yang terlalu besar untuk kasus sederhana Anda.


+1 Ini adalah pendekatan terbaik untuk menjaganya agar tetap sederhana dan tidak menyulitkan sesuatu yang seharusnya tidak terlalu rumit.
Thomas Stringer

3

Hanya untuk membangun pada jawaban JDT, cara umum untuk melakukan ini adalah menulis pesan ke antrian pesan. Kapan pun sesuatu yang penting terjadi dalam aplikasi Anda, ia akan menulis pesan dan mengirimkannya ke antrian pesan. Biasanya format pesannya adalah XML atau serupa. Ini penulis antrian.

Aplikasi pemantauan membaca (pembaca antrian) antrian dan mengambil pesan dan memprosesnya dengan menyimpannya dan menganalisis pesan versus pesan atau ketentuan sebelumnya. Jika suatu kondisi terpenuhi, aplikasi pemantauan akan memunculkan peringatan yang menandakan masalah potensial.

Ini memisahkan aplikasi Anda dari pemantauan itu sendiri karena hanya menembakkan pesan. Terserah aplikasi pemantauan untuk menentukan kapan berdasarkan pesan saat ini bahwa sesuatu yang baik atau buruk telah terjadi. Antrian digunakan karena mereka menawarkan sarana yang baik untuk menyimpan pesan tanpa kehilangan.

Anda ingin memusatkan pesan jika ada beberapa contoh aplikasi Anda berjalan. Jika hanya ada 1 instance, maka menggunakan toko lain seperti windows event log atau file sudah cukup.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.