سؤال

لدي القضية التالية وأود أن أعرف ما يحدث بالضبط. أنا أستخدم جافا جدولة Createxecutorservice. لتشغيل مهمة كل خمس دقائق. أنه يعمل بشكل جيد جدا. غير المنفصين تماما الطريقة التي أقوم بها برمجة موضوع في جافا.

الآن، استعرضت java doc للحصول على معلومات حول ما سيكون هو السلوك في حالة فشل المهمة المجدولة باستثناء غير معالج، ولكن لا يمكن العثور على أي شيء.

هل لا تزال المهمة المجدولة التالية ستستمر؟ إذا كان هناك استثناء غير معالج، فإن التنفيذ المجدول يتوقف مهمة الجدولة؟ هل يمكن لأي شخص أن يشير إلى معلومات بخصوص هذه المشكلة البسيطة؟

شكرا جزيلا.

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

المحلول

جافادوك كليهما scheduleAtFixedRate و scheduleWithFixedDelay يقول "إذا كان أي إعدام للمهمة يواجه استثناء، يتم إجماع عمليات الإعدام اللاحقة". لا أجد أن أن تكون واضحة بالضبط، ولكن يبدو أن هذا يقول إنه إذا كان لديك run الطريقة يلقي أي نوع من الاستثناء، ثم سيقوم المجدول بإسقاط هذه المهمة بشكل فعال. يجب ألا تتأثر أي مهام أخرى تعمل عبر هذا المجدول. لا ينبغي أن يكون من الصعب اختبار ما يفعله بالفعل ...

إلغاء المهمة قد لا يكون بالضرورة شيئا سيئا. إذا كانت طريقة التشغيل ترمي RuntimeException, ، ربما حصلت على خطأ في مكان ما، وحالة النظام غير معروف. ولكن على الأقل أود أن أنصح اللحاب RuntimeException في طريقة التشغيل الخاصة بك، وقم بتسجيل تتبع المكدس الكامل في حالة شديدة. قد ترغب في ذلك ثم rethrow لإلغاء المهمة، اعتمادا على الظروف. ولكن في كلتا الحالتين، ستحتاج إلى تسجيل للحصول على فرصة قتال لإجراء ما حدث خطأ.

نصائح أخرى

إذا كنت تستخدم scheduleAtFixedRate() أو scheduleAtFixedDelay(), ، ودفاع المهام الخاصة بك مع استثناء، لن يتم إعادة جدولة هذه المهمة. ومع ذلك، ينبغي أن تستمر المهام المستقلة الأخرى في التنفيذ كما هو متوقع. (يرى مستندات API). إذا كنت تهتم بأن هذا قد حدث، يمكنك الاستيلاء على ahold ScheduledFuture التي يتم إرجاعها واستدعاء get() طريقة. إذا كانت المهمة الأساسية ترمي استثناء، فسوف تحصل عليه get() الطريقة، ملفوفة في ExecutionException.

هذا الرجل لديه نفس المشكلة.

http://code.nomad-labs.com/2011/12/09/mother-fk-the-scheduledexecutorservice/

حله هو اللحاق Exception داخل Runnable وإعادة رمي RuntimeException:

try {
       theRunnable.run();
    } catch (Exception e) {
       // LOG IT HERE!!!
       System.err.println("error in executing: " + theRunnable + ". It will no longer be run!");
       e.printStackTrace();

       // and re throw it so that the Executor also gets this error so that it can do what it would
       // usually do
       throw new RuntimeException(e);
}

يبدو أن API لا يحدد أي آلية معالجة استثناء محددة. أي استثناء غير مصرح للملوثات العضوية الثابتة فقط من خلال إطارات الخيط ويتم تسجيل الدخول في النهاية إلى Stderr.

أرى أنه يمكنك استغلال استراتيجيات معالجة الاستثناء التالية:

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