Hangfire: Cara melewati eksekusi bersamaan tanpa gagal dalam pekerjaan

Dibuat pada 11 Jul 2017  ·  4Komentar  ·  Sumber: HangfireIO/Hangfire

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

question

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.

Semua 4 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat