Saya mendapat pekerjaan berulang yang menggunakan DisableConcurrentExecution(timeout:0)
(0 coba lagi), karena hanya satu pekerja yang harus memprosesnya pada waktu tertentu, khususnya jika pekerjaan membutuhkan waktu lebih dari satu menit untuk diselesaikan (bervariasi).
Saya tidak ingin pekerjaan yang "dilewati" ditandai sebagai failed
di dasbor, jadi saya ingin menambahkan SkipConcurrentExecutionAttribute
yang hampir identik dengan DisableConcurrentExecutionAttribute
, kecuali bahwa itu akan mencoba/menangkap akuisisi kunci, dan menelan DistributedLockTimeoutException
dan mengatur pekerjaan ke DeletedState
dengan alasan mengapa.
Tapi saya tidak bisa melakukannya dengan benar, karena GetResource() bersifat pribadi, dan implementasinya merujuk ke metode lain yang ada di dalam perpustakaan.
$"{job.Type.ToGenericTypeString()}.{job.Method.Name}"
tampaknya merupakan cara aman untuk menghasilkan nama kunci terdistribusi yang tidak bertentangan, tetapi saya tidak dapat merujuknya.
Bisakah kita memiliki di lib metode publik yang menghasilkan nama kunci terdistribusi pekerjaan?
lih., https://discuss.hangfire.io/t/disableconcurentexecution-for-job-groups/1389/4
Saya baru menyadari bahwa filterContext.BackgroundJob.Job.ToString()
akan memberikan string yang sama dengan implementasi TypeExtensions.cs dan DisableConcurrentExecutionAttribute.cs (re) internal akan... masalah terpecahkan.
@dgaspar , Anda dapat memberi tahu penjadwal pekerjaan berulang untuk melewati pembuatan pekerjaan berulang berikutnya, ketika yang sebelumnya masih berjalan, silakan lihat intisari ini: https://Gist.github.com/odinserj/a6ad7ba6686076c9b9b2e03fcf6bf74e.
Terima kasih atas sarannya @odinserj. Saya perhatikan bahwa jika pekerja mogok selama eksekusi, baris "Berjalan" itu akan tetap ada di tabel Hash. Apakah ini akan mencegah pekerjaan dijadwalkan ulang, sampai saya menghapus baris itu secara manual? Atau apakah ada kedaluwarsa/pembersihan yang saya lewatkan? (btw, saya menggunakan new SqlServerStorageOptions { SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5) }
, jika itu penting)
Ketika seorang pekerja dihentikan selama pelaksanaan pekerjaan latar belakang, pekerjaan latar belakang itu akan dijadwal ulang secara otomatis, karena semua antrian pesan bersifat transaksional (setidaknya yang resmi, implementasi penyimpanan lainnya harus bertindak dengan cara yang sama).
Komentar yang paling membantu
@dgaspar , Anda dapat memberi tahu penjadwal pekerjaan berulang untuk melewati pembuatan pekerjaan berulang berikutnya, ketika yang sebelumnya masih berjalan, silakan lihat intisari ini: https://Gist.github.com/odinserj/a6ad7ba6686076c9b9b2e03fcf6bf74e.