Hangfire: كيفية تخطي عمليات الإعدام المتزامنة دون الفشل في الوظيفة

تم إنشاؤها على ١١ يوليو ٢٠١٧  ·  4تعليقات  ·  مصدر: HangfireIO/Hangfire

لقد حصلت على وظيفة متكررة للغاية تستخدم 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

question

التعليق الأكثر فائدة

dgaspar ، يمكنك إخبار برنامج جدولة الوظائف المتكررة بتخطي إنشاء الوظيفة المتكررة التالية ، عندما لا تزال الوظيفة السابقة قيد التشغيل ، يرجى الاطلاع على هذا الجوهر: https://gist.github.com/odinserj/a6ad7ba6686076c9b9b2e03fcf6bf74e.

ال 4 كومينتر

لقد لاحظت للتو أن filterContext.BackgroundJob.Job.ToString() سيعطي نفس السلسلة مثل TypeExtensions.cs الداخلية وتطبيقات DisableConcurrentExecutionAttribute.cs (إعادة) ... حل المشكلة.

dgaspar ، يمكنك إخبار برنامج جدولة الوظائف المتكررة بتخطي إنشاء الوظيفة المتكررة التالية ، عندما لا تزال الوظيفة السابقة قيد التشغيل ، يرجى الاطلاع على هذا الجوهر: https://gist.github.com/odinserj/a6ad7ba6686076c9b9b2e03fcf6bf74e.

شكرا على الاقتراحodinserj. لقد لاحظت أنه في حالة تعطل العامل أثناء التنفيذ ، فإن صف "الجري" سيبقى في جدول التجزئة. هل ستمنع إعادة جدولة الوظيفة ، حتى أحذف هذا الصف يدويًا؟ أم أن هناك انتهاء صلاحية / تنظيف مفقود؟ (راجع للشغل ، أنا أستخدم new SqlServerStorageOptions { SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5) } ، إذا كان ذلك مهمًا)

عندما يتم إنهاء عامل أثناء تنفيذ وظيفة في الخلفية ، ستتم إعادة جدولة هذه الوظيفة في الخلفية تلقائيًا ، لأن جميع قوائم انتظار الرسائل هي معاملات (على الأقل القوائم الرسمية ، يجب أن تعمل تطبيقات التخزين الأخرى بنفس الطريقة).

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات