Hari ini kami telah membangun aplikasi konsol untuk menjalankan tugas yang dijadwalkan untuk situs web ASP.NET kami. Tapi saya pikir pendekatan ini agak rawan kesalahan dan sulit dipertahankan. Bagaimana Anda menjalankan tugas yang dijadwalkan (di lingkungan windows / IIS / ASP.NET)
Memperbarui:
Contoh tugas:
- Mengirim email dari antrian email di basis data
- Menghapus objek yang sudah usang dari database
- Mengambil statistik dari Google AdWords dan mengisi tabel di database.
asp.net
windows
iis
scheduled-tasks
Niels Bosma
sumber
sumber
Jawaban:
Semua tugas saya (yang perlu dijadwalkan) untuk situs web disimpan dalam situs web dan dipanggil dari halaman khusus. Saya kemudian menulis layanan Windows sederhana yang sering memanggil halaman ini. Setelah halaman berjalan itu mengembalikan nilai. Jika saya tahu ada lebih banyak pekerjaan yang harus dilakukan, saya menjalankan halaman lagi, segera, kalau tidak saya menjalankannya sebentar lagi. Ini telah bekerja dengan sangat baik untuk saya dan menjaga semua logika tugas saya dengan kode web. Sebelum menulis layanan Windows yang sederhana, saya menggunakan penjadwal Windows untuk memanggil halaman setiap x menit.
Cara mudah lain untuk menjalankan ini adalah dengan menggunakan layanan pemantauan seperti Pingdom . Arahkan cek http mereka ke halaman yang menjalankan kode layanan Anda. Minta halaman mengembalikan hasil yang kemudian dapat digunakan untuk memicu Pingdom untuk mengirim pesan peringatan ketika ada sesuatu yang tidak beres.
sumber
Teknik ini oleh Jeff Atwood untuk Stackoverflow adalah metode paling sederhana yang pernah saya temui. Itu bergantung pada mekanisme panggilan balik "cache item dihapus" membangun ke dalam sistem cache ASP.NET
Pembaruan: Stackoverflow telah melampaui metode ini. Ini hanya berfungsi saat situs web berjalan tetapi ini adalah teknik yang sangat sederhana yang berguna bagi banyak orang.
Lihat juga Quartz.NET
sumber
No, we’ve switched to a dedicated task. We definitely outgrew this technique. I do think it’s fine for small sites though!
- Jeff AtwoodBuat Layanan Windows khusus .
Saya memiliki beberapa tugas penting yang diatur sebagai aplikasi konsol terjadwal dan sulit untuk dipelihara. Saya membuat Layanan Windows dengan 'detak jantung' yang akan memeriksa jadwal di DB saya setiap beberapa menit. Itu bekerja dengan sangat baik.
Karena itu, saya masih menggunakan aplikasi konsol terjadwal untuk sebagian besar tugas pemeliharaan tidak kritis saya. Jika tidak rusak, jangan memperbaikinya.
sumber
Saya menemukan ini mudah bagi semua yang terlibat:
Dengan menggunakan metodologi ini, semua logika bisnis terdapat di aplikasi web Anda, tetapi Anda memiliki keandalan manajer tugas windows, atau manajer tugas komersial lainnya untuk memulai dan mencatat informasi pengembalian seperti laporan eksekusi. Menggunakan layanan web alih-alih memposting ke halaman memiliki sedikit keuntungan karena lebih mudah untuk mendapatkan data pengembalian dari layanan web.
sumber
Mengapa menemukan kembali roda, gunakan kelas Threading dan Timer.
sumber
Gunakan Penjadwal Windows untuk menjalankan halaman web.
Untuk mencegah pengguna jahat atau spider mesin pencari untuk menjalankannya, ketika Anda mengatur tugas yang dijadwalkan, cukup panggil halaman web dengan querystring, yaitu: mypage.aspx? Dari = dijadwalkantask
Kemudian di halaman memuat, cukup gunakan kondisi: if (Request.Querystring ["from"] == "dijadwalkantask") {// executetask}
Dengan cara ini, tidak ada spider mesin pencari atau pengguna jahat yang dapat menjalankan tugas yang dijadwalkan.
sumber
Request.IsLocal
>> hanya server itu sendiri yang dapat menjalankan tugas yang dijadwalkan, tidak ada orang lain.Perpustakaan ini berfungsi seperti pesona http://www.codeproject.com/KB/cs/tsnewlib.aspx
Ini memungkinkan Anda untuk mengelola tugas terjadwal Windows secara langsung melalui kode .NET Anda.
sumber
Selain itu, jika aplikasi Anda menggunakan SQL SERVER Anda dapat menggunakan Agen SQL untuk menjadwalkan tugas Anda. Di sinilah kami biasanya memasukkan kode yang muncul kembali yang didorong oleh data (pengingat email, pemeliharaan terjadwal, pembersihan, dll ...). Fitur hebat yang terintegrasi dengan SQL Agent adalah opsi pemberitahuan kegagalan, yang dapat memberi tahu Anda jika tugas penting gagal.
sumber
Saya tidak yakin tugas terjadwal seperti apa yang Anda maksud. Jika Anda bermaksud hal-hal seperti "setiap jam, segarkan foo.xml" jenis tugas, kemudian gunakan sistem Tugas Terjadwal Windows. (Perintah "at", atau melalui controller.) Apakah itu menjalankan aplikasi konsol atau meminta halaman khusus yang memulai proses.
Sunting: Saya harus menambahkan, ini adalah cara OK untuk menjalankan aplikasi IIS Anda pada titik yang dijadwalkan juga. Jadi misalkan Anda ingin memeriksa DB Anda setiap 30 menit dan mengirimkan email kepada pengguna tentang beberapa data, Anda dapat menggunakan tugas yang dijadwalkan untuk meminta halaman ini dan karenanya mendapatkan hal-hal pemrosesan IIS.
Jika kebutuhan Anda lebih kompleks, Anda dapat mempertimbangkan untuk membuat Layanan Windows dan menjalankannya untuk melakukan proses apa pun yang Anda butuhkan. Ini juga bermanfaat memisahkan kode untuk tujuan penskalaan atau manajemen. Pada sisi negatifnya, Anda perlu berurusan dengan layanan Windows.
sumber
Jika Anda memiliki server, Anda harus menggunakan penjadwal tugas windows. Gunakan AT /? dari baris perintah untuk melihat opsi.
Kalau tidak, dari lingkungan berbasis web, Anda mungkin harus melakukan sesuatu yang tidak menyenangkan seperti mengatur mesin yang berbeda untuk membuat permintaan ke halaman tertentu pada interval waktu.
sumber
Saya telah menggunakan Abidar dengan sukses dalam proyek ASP.NET (inilah beberapa informasi latar belakang ).
Satu-satunya masalah dengan metode ini adalah bahwa tugas tidak akan berjalan jika aplikasi web ASP.NET diturunkan dari memori (mis. Karena penggunaan yang rendah). Satu hal yang saya coba adalah membuat tugas untuk menekan aplikasi web setiap 5 menit, menjaganya tetap hidup, tetapi ini tampaknya tidak berfungsi dengan baik, jadi sekarang saya menggunakan scheduler Windows dan aplikasi konsol dasar untuk melakukan ini sebagai gantinya.
Solusi ideal adalah membuat layanan Windows, meskipun ini mungkin tidak mungkin (mis. Jika Anda menggunakan lingkungan hosting bersama). Ini juga membuat segalanya sedikit lebih mudah dari perspektif pemeliharaan untuk menjaga hal-hal dalam aplikasi web.
sumber
Inilah cara lain:
1) Buat skrip web "detak jantung" yang bertanggung jawab untuk meluncurkan tugas-tugas jika tugasnya DUE atau terlambat untuk diluncurkan.
2) Buat proses terjadwal di suatu tempat (lebih disukai di server web yang sama) yang mengenai skrip web dan memaksanya untuk berjalan pada interval reguler. (mis. Windows menjadwalkan tugas yang secara diam-diam meluncurkan skrip heatbeat menggunakan IE atau apa saja)
Fakta bahwa kode tugas terkandung dalam skrip web adalah murni demi menjaga kode dalam basis kode aplikasi web (asumsinya adalah bahwa keduanya saling bergantung satu sama lain), yang akan lebih mudah bagi pengembang web untuk mengelola .
Pendekatan alternatif adalah untuk membuat skrip / program server yang dapat dieksekusi yang melakukan semua jadwal bekerja sendiri dan menjalankan executable itu sendiri sebagai tugas yang dijadwalkan. Ini dapat memungkinkan pemisahan secara mendasar antara aplikasi web dan tugas yang dijadwalkan. Oleh karena itu jika Anda memerlukan tugas yang dijadwalkan untuk berjalan bahkan di aplikasi web / database yang mungkin turun atau tidak dapat diakses, Anda harus pergi dengan pendekatan ini.
sumber
Anda dapat dengan mudah membuat Layanan Windows yang menjalankan kode pada interval menggunakan metode 'ThreadPool.RegisterWaitForSingleObject'. Ini benar-benar licin dan cukup mudah diatur. Metode ini adalah pendekatan yang lebih ramping kemudian menggunakan Timers dalam Kerangka.
Lihat tautan di bawah untuk informasi lebih lanjut:
Menjalankan Proses Berkala di .NET menggunakan Layanan Windows: http://allen-conway-dotnet.blogspot.com/2009/12/running- periodic-process-in-net-
using.html
sumber
Kami juga menggunakan aplikasi konsol. Jika Anda menggunakan alat logging seperti Log4net, Anda dapat memantau eksekusi dengan benar. Juga, saya tidak yakin bagaimana mereka lebih sulit untuk dipelihara daripada sebuah halaman web, mengingat Anda mungkin berbagi beberapa pustaka kode yang sama antara keduanya jika dirancang dengan benar.
Jika Anda menentang menjalankan tugas-tugas tersebut berdasarkan waktu, Anda dapat memiliki halaman web di bagian administratif situs web Anda yang bertindak sebagai antrian. Pengguna mengajukan permintaan untuk menjalankan tugas, itu pada gilirannya menyisipkan catatan datestamp kosong pada tabel MyProcessQueue dan tugas terjadwal Anda memeriksa setiap X menit untuk catatan baru di MyProcessQueue. Dengan begitu, itu hanya berjalan ketika pelanggan ingin menjalankannya.
Semoga saran itu membantu.
sumber
Salah satu opsi adalah mengatur layanan windows dan memanggilnya untuk melakukan tugas yang dijadwalkan.
Dalam winforms saya telah menggunakan Timers put tidak berpikir ini akan bekerja dengan baik di ASP.NET
sumber
Perpustakaan Kelas Penjadwal Tugas Baru untuk .NET
Catatan: Sejak perpustakaan ini dibuat, Microsoft telah memperkenalkan penjadwal tugas baru (Penjadwal Tugas 2.0) untuk Windows Vista. Pustaka ini adalah pembungkus untuk antarmuka Penjadwal Tugas 1.0, yang masih tersedia di Vista dan kompatibel dengan Windows XP, Windows Server 2003 dan Windows 2000.
http://www.codeproject.com/KB/cs/tsnewlib.aspx
sumber