سؤال

@Scheduled(fixedDelay = 5000)
public void myJob() {
     Thread.sleep(12000);
}

كيف يمكنني منع تشغيل هذه المهمة الربيعية إذا لم ينته الروتين السابق بعد؟

هل كانت مفيدة؟

المحلول

مع fixedDelay، يتم قياس الفترة بعد الانتهاء من الوظيفة، لذلك لا تقلق.

نصائح أخرى

بشكل افتراضي، يستخدم الربيع منفذًا مفردًا.لذلك لن تتداخل مهمتانScheduled أبدًا.حتى طريقتينScheduled في فئات غير مرتبطة تمامًا لن تتداخلا ببساطة بسبب لا يوجد سوى موضوع واحد لتنفيذ جميع المهام المجدولة.

علاوة على ذلك، حتى إذا قمت باستبدال المنفذ الافتراضي بمنفذ يعتمد على تجمع مؤشرات الترابط، فإن هؤلاء المنفذين عادةً ما يؤخرون تنفيذ مثيل المهمة حتى يكتمل المثيل المجدول مسبقًا.هذا صحيح ل تأخير ثابت، ثابت الفاصل، وكرون الجداول الزمنية القائمة.على سبيل المثال، سيؤدي تكوين الربيع هذا إلى إنشاء ملف جدولة ThreadPoolExecutor يستخدم مجموعة مؤشرات الترابط، لكنه لا يسمح بالمثيلات المتزامنة لنفس الجدول كما تريد تمامًا:

@Configuration
@EnableScheduling
...
public class MySpringJavaConfig {
    @Bean(destroyMethod = "shutdown")
    public Executor taskScheduler() {
        return Executors.newScheduledThreadPool(5);
    }
    ...
}

هنا هو javadoc لـ SchededThreadPoolExecutor::scheduleAtFixedRate الذي يحدد:

إذا استغرق تنفيذ هذه المهمة وقتًا أطول من مدتها، فقد تبدأ عمليات التنفيذ اللاحقة في وقت متأخر، ولكن لن يتم تنفيذها بشكل متزامن.

ملحوظة:هذه الوظيفة لا تنطبق على @المهام المتزامنة.سيقوم Spring بإنشاء العديد من المثيلات المتزامنة لتلك حسب الحاجة (إذا كان هناك سلاسل رسائل كافية في التجمع).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top