سؤال

أواجه مشكلة في اكتشاف الخدمات التي توفرها بعض حزم OSGI التي لا يتم تنشيطها. اسمحوا لي أن أصف الوضع:

  • حزمة يحدد الواجهة x
  • توفر حزم B و C و D الخدمات التي تنفذ واجهة X
    • يتم تسجيل خدمات حزم هذه عبر الربيع DM، لذلك يتم إنشاؤها فقط عند تنشيط الحزمة وينتهي ربيع DM تهيئة سياق التطبيق المحدد في الحزمة
  • يتم تنشيط Bundle A وفي مرحلة ما يسأل سجل الخدمة للخدمات للخدمات للواجهة X. لا يجد أي، لأن حزم B، C، و D لم يتم نقلها إلى الحالة النشطة (يتم حلها فقط).

لا أستطيع أن أحصل على حزم B أو C أو D للبدء، وبالتالي تسجيل خدماتهم. إجبارهم على البدء بإضافة لهم إلى config.ini ليس خيارا، لأنه يمكن أن يكون هناك أي عدد من الحزم المثبتة في التطبيق (عبر آلية تحديث Eclipse P2) التي تنفذ واجهة X.

التطبيق هو تطبيق RCP مقيم 3.5 Eclipse، باستخدام Spring 2.5.6 و Spring DM 1.2.1.

كيف أجبر هذه الحزم التي سيتم تنشيطها؟

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

المحلول

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

ما يجب أن تنظر فيه حقا هو بنية نظامك، على أنه فعال ما لديك هو الاعتماد الدائري (إعادة: مناقشة في التعليقات الخاصة بك الأصلي). لديك (مثل ذلك أم لا) يتطلب خدمات من (وبشكل منطقي يعتمد على) B و C. في الوقت نفسه، تعتمد B و C مباشرة على A، وعلى هذا النحو، لا تستطيع تبدأ حتى يأتي.

في أفضل الأحوال، يمكنك كتابة التعليمات البرمجية في B و C للاستماع إلى وجود A، ولكن هذا في أفضل الأحواض (كما ذكرت) القضية الأساسية. ما يجب أن تفكر فيه حقا هو تقسيم إلى حزمتين، دعونا نسميهم A1 و A2.

يجب أن توفر A1 الواجهة التي تحتاجها B و C (تعتمد على). يجب أن يكون لدى A2 مستمعين للخدمات B و C تعتمد على. عند بدء التشغيل، إذا كانت B و C للخدمات المطلوبة، يجب تشغيل A1، ولكن قد يبدأ A2 في وقت لاحق، ويجب أن يعمل كل شيء.

نصائح أخرى

أعتقد أنني عثرت على الحل لهذه المشكلة، على الرغم من أنها تشعر بالتبخر قليلا.

ركضت عبر هذا الموضوع حيث ضمن أدريان كولير أن "مراقب حزمة خارجي" يمكن أن يكون مسؤولا عن تنشيط حزم عند تثبيته في الإطار.

لذلك، كان الحل الخاص بي:

  • إضافة رأس مخصص إلى إظهار B-C، C، و D'S، على سبيل المثال، "MyApp-Autostart: True"
  • قم بإنشاء مستمع Bundle يستجيب عند نقل الحزمة إلى الحالة المشكلة، ويبحث عن الرأس
  • إذا كانت قيمة الرأس "صحيحة"، فإن المستمع Bundle يدعو bundle.start()

عند استخدام هذه الطريقة، بدأت الحزم التي أريد بدء تشغيلها دون الحاجة إلى اللجوء إلى استخدام config.ini, ، ويمكن أن تأتي وتذهب كما هي من فضلك، لكن خدماتهم متوفرة عند الاستعلام.

اطلب من إلقاء نظرة على felix fileinstall، والتي تشاهد دليلا للحزم وتثبيتها تلقائيا وبدء تشغيلها. عند حذف ملف، يتم إيقاف الحزمة وإلغاء تثبيتها أيضا.

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