لقد حصلت على وظيفة متكررة للغاية تستخدم DisableConcurrentExecution(timeout:0)
(0 إعادة المحاولة) ، حيث يجب أن يقوم عامل واحد فقط بمعالجتها في وقت معين ، خاصة إذا كانت الوظيفة تستغرق أكثر من دقيقة لإكمالها (يختلف الأمر).
لا أريد أن يتم وضع علامة على الوظائف "التي تم تخطيها" على أنها failed
على لوحة التحكم ، لذلك أردت إضافة SkipConcurrentExecutionAttribute
والتي ستكون مطابقة تقريبًا لـ DisableConcurrentExecutionAttribute
، باستثناء أنه سيحاول / يلتقط اكتساب القفل ، ويبتلع DistributedLockTimeoutException
ويضبط الوظيفة على DeletedState
مع سبب ذلك.
لكن لا يمكنني القيام بذلك بشكل صحيح ، لأن GetResource () خاص ، ويشير تنفيذه إلى طرق أخرى داخلية في المكتبة.
يبدو أن $"{job.Type.ToGenericTypeString()}.{job.Method.Name}"
هو الطريقة الآمنة لإنتاج أسماء أقفال موزعة غير متضاربة ، لكن لا يمكنني الرجوع إليها.
هل يمكن أن يكون لدينا في lib طريقة عامة تنشئ اسم القفل الموزع للوظيفة؟
راجع ، https://discuss.hangfire.io/t/disableconcurentexecution-for-job-groups/1389/4
لقد لاحظت للتو أن filterContext.BackgroundJob.Job.ToString()
سيعطي نفس السلسلة مثل TypeExtensions.cs الداخلية وتطبيقات DisableConcurrentExecutionAttribute.cs (إعادة) ... حل المشكلة.
dgaspar ، يمكنك إخبار برنامج جدولة الوظائف المتكررة بتخطي إنشاء الوظيفة المتكررة التالية ، عندما لا تزال الوظيفة السابقة قيد التشغيل ، يرجى الاطلاع على هذا الجوهر: https://gist.github.com/odinserj/a6ad7ba6686076c9b9b2e03fcf6bf74e.
شكرا على الاقتراحodinserj. لقد لاحظت أنه في حالة تعطل العامل أثناء التنفيذ ، فإن صف "الجري" سيبقى في جدول التجزئة. هل ستمنع إعادة جدولة الوظيفة ، حتى أحذف هذا الصف يدويًا؟ أم أن هناك انتهاء صلاحية / تنظيف مفقود؟ (راجع للشغل ، أنا أستخدم new SqlServerStorageOptions { SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5) }
، إذا كان ذلك مهمًا)
عندما يتم إنهاء عامل أثناء تنفيذ وظيفة في الخلفية ، ستتم إعادة جدولة هذه الوظيفة في الخلفية تلقائيًا ، لأن جميع قوائم انتظار الرسائل هي معاملات (على الأقل القوائم الرسمية ، يجب أن تعمل تطبيقات التخزين الأخرى بنفس الطريقة).
التعليق الأكثر فائدة
dgaspar ، يمكنك إخبار برنامج جدولة الوظائف المتكررة بتخطي إنشاء الوظيفة المتكررة التالية ، عندما لا تزال الوظيفة السابقة قيد التشغيل ، يرجى الاطلاع على هذا الجوهر: https://gist.github.com/odinserj/a6ad7ba6686076c9b9b2e03fcf6bf74e.