ما هي أفضل طريقة لمشاركة مثيلات كائنات العمل بين تطبيقات الويب Java باستخدام JBoss و Spring؟

StackOverflow https://stackoverflow.com/questions/268129

سؤال

لدينا حاليًا تطبيق ويب يقوم بتحميل سياق تطبيق Spring الذي يقوم بتثبيت مجموعة من كائنات العمل والكائنات DAO و Hibernate. نود مشاركة هذا المكدس مع تطبيق ويب آخر ، لتجنب وجود مثيلات متعددة من نفس الكائنات.

لقد بحثنا في عدة طرق. تعريض الكائنات باستخدام JMX أو JNDI ، أو باستخدام EJB3.

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

أي اقتراحات حول كيفية حل هذه المشكلة؟

تحرير: لقد تلقيت تعليقات تطلب مني توضيح بعض الشيء ، لذلك يذهب هنا:

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

أولاً ، حاولنا أن ننظر إلى كيفية تعرض طبقة العمل وحدها لتطبيقات الويب الأخرى ، ويوفر Spring jmx لف بسعر كمية صغيرة من XML. ومع ذلك ، لم نتمكن من ربط كيانات JMX بشجرة JNDI ، لذلك لم نتمكن من البحث عن الكائنات من تطبيقات الويب.

ثم حاولنا ربط طبقة العمل مباشرة إلى JNDI. على الرغم من أن Spring لم يقدم أي طريقة لهذا ، فإن استخدام JNDitemplate لربطها كان أيضًا تافهة. ولكن هذا أدى إلى العديد من المشكلات الجديدة: 1) مدير الأمن يحرم من الوصول إلى RMI ClassLoader ، لذلك فشل العميل بمجرد محاولة استدعاء الأساليب في مورد JNDI. 2) بمجرد حل المشكلات الأمنية ، قام JBoss بإلغاء unclelargumentException: الكائن ليس مثيلًا لإعلان الفصل. يكشف القليل من القراءة أننا نحتاج إلى تطبيقات كعباء لموارد JNDI ، ولكن هذا يبدو وكأنه الكثير من المتاعب (ربما يمكن أن يساعدنا الربيع؟)

لم ننظر كثيرًا إلى EJB حتى الآن ، لكن بعد محاولتين الأولين ، أتساءل عما إذا كان ما نحاول تحقيقه ممكنًا على الإطلاق.

لتلخيص ما نحاول تحقيقه: مثيل JBOSS واحد ، تستخدم العديد من تطبيقات الويب كومة واحدة من كائنات العمل أعلى طبقة DAO و Hibernate.

مع أطيب التحيات،

نيلز

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

المحلول

هل تم نشر تطبيقات الويب على نفس الخادم؟

لا يمكنني التحدث عن الربيع ، لكن من السهل نقل منطق عملك إلى طبقة EJB باستخدام حبوب الجلسة.

منظمة التطبيقات مستقيمة للأمام. ينتقل المنطق إلى حبوب الجلسة ، ويتم تجميع حبوب الجلسة هذه داخل جرة واحدة باعتبارها قطعة أثرية Java EE مع ملف EJB-JAR.xml (في EJB3 ، من المحتمل أن يكون هذا فارغًا عمليًا).

ثم قم بتجميع فصول الكيان في ملف جرة منفصل.

بعد ذلك ، ستقوم بإنشاء كل تطبيق ويب في ملف الحرب الخاص بهم.

أخيرًا ، يتم تجميع جميع الجرار والحروب في Java ee Ear ، مع ملف Application.xml المرتبط (مرة أخرى ، من المحتمل أن يكون هذا ضئيلًا للغاية ، ببساطة تعداد الجرار في الأذن).

يتم نشر هذه الأذن بالجملة على خادم التطبيق.

كل حرب مستقلة بشكل فعال - جلساتها الخاصة ، وهناك مسارات سياق خاصة ، وما إلى ذلك ، لكنها تشترك في نهاية EJB المشتركة ، لذلك لديك فقط ذاكرة التخزين المؤقت من المستوى الثاني.

يمكنك أيضًا استخدام المراجع المحلية والاتصال الدلالي للتحدث إلى EJBs لأنها في نفس الخادم. لا حاجة للمكالمات عن بُعد هنا.

أعتقد أن هذا يحل جيدًا المشكلة التي تواجهها ، وهي واضحة تمامًا في Java EE 5 مع EJB 3.

أيضًا ، لا يزال بإمكانك استخدام Spring في الكثير من عملك ، كما أفهم ، لكنني لست شخصًا في الربيع ، لذا لا يمكنني التحدث إلى التفاصيل.

نصائح أخرى

ماذا عن Spring ParentContext؟ تحقق من هذه المقالة:

http://springtips.blogspot.com/2007/06/using-hared-parent-application-context.html

التراكوتا قد تكون مناسبة جيدة هنا (الكشف: أنا مطور لتراكوتا). Terracotta تجمع بشفافية كائنات Java على مستوى JVM ، ويندمج مع كل من الربيع والإسبات. انه مصدر مجاني ومفتوح.

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

أما بالنسبة لكائنات عملك ، يمكنك استخدام Terracotta's تكامل الربيع لتجميع الفاصوليا - يمكن لكل تطبيق ويب مشاركة مثيلات الفاصوليا المجمعة ، ويحافظ Terracotta على الحالة المجمعة بالتزامن بشفافية.

في الواقع ، إذا كنت تريد حلًا خفيف الوزن ولا تحتاج إلى معاملات أو تجميع ، فما عليك سوى استخدام دعم الربيع لـ RMI. يسمح بفضح حبوب الربيع عن بُعد باستخدام التعليقات التوضيحية البسيطة في أحدث الإصدارات. نرى http://static.springframework.org/spring/docs/2.0.x/reference/remoting.html.

يجب عليك إلقاء نظرة على تطبيق الويب المرجعي Terracotta - الممتحن. إنه يحتوي على معظم المكونات التي تبحث عنها - لقد حصلت على السبات ، JPA ، والربيع مع خلفية MySQL.

تم ضبطه مسبقًا لتوسيع نطاق ما يصل إلى 16 عقدة ، 20 ألف مستخدم متزامن.

تحقق من ذلك هنا: http://reference.terracotta.org/examinator

شكرا لك على إجاباتك حتى الآن. ما زلنا غير موجودين تمامًا ، لكننا جربنا بعض الأشياء الآن ونرى الأشياء بشكل أكثر وضوحًا. هذا تحديث قصير:

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

لقد جربنا أيضًا مسار JNDI ، والذي ينتهي بالحاجة إلى كوب من جميع الواجهات المشتركة. هذا يبدو وكأنه الكثير من المتاعب ، مع الأخذ في الاعتبار أن كل شيء على نفس الخادم على أي حال.

بالأمس ، كان لدينا استراحة صغيرة مع JMX. على الرغم من أن JMX لا يعني بالتأكيد هذا النوع من الاستخدام ، فقد أثبتنا أنه يمكن القيام به - مع عدم وجود تغييرات في التعليمات البرمجية وأقل قدر من XML (شكراً جزيلاً على Spring for Mbeanexporter و Mbeanproxyfactorybean). العيوب الرئيسية لهذه الطريقة هي الأداء وحقيقة أنه يجب مشاركة فئات المجال لدينا من خلال مجلد خادم/LIB JBOSS. أي ، يتعين علينا إزالة بعض التبعيات من حروبنا ونقلها إلى الخادم/lib ، وإلا نحصل على classcastexception عندما تقوم طبقة العمل بإرجاع الكائنات من نموذج المجال الخاص بنا. أنا أفهم تمامًا سبب حدوث ذلك ، لكنه ليس مثاليًا لما نحاول تحقيقه.

اعتقدت أن الوقت قد حان لتحديث القليل ، لأن ما يبدو أنه أفضل حل سيستغرق بعض الوقت للتنفيذ. سأقوم بنشر النتائج التي توصلنا إليها هنا بمجرد القيام بهذه الوظيفة.

الربيع لديه نقطة تكامل قد تكون ذات أهمية بالنسبة لك: EJB 3 حقن nterceptor. هذا يمكّنك من الوصول إلى حبوب الربيع من EJBS.

لست متأكدًا حقًا مما تحاول حله ؛ في نهاية اليوم ، سيكون لكل JVM إما مثيلات مكررة للكائنات ، أو شبعات تمثل الكائنات الموجودة على خادم (منطقي) آخر.

يمكنك إعداد خادم "منطق الأعمال" الثالث الذي يحتوي على واجهة برمجة تطبيقات عن بُعد يمكن أن يتصل بتطبيقات الويب الخاصة بك. الحل النموذجي هو استخدام EJB ، لكنني أعتقد أن Spring يحتوي على خيارات عن بُعد مدمجة في مكدته.

الخيار الآخر هو استخدام شكل من أشكال بنية ذاكرة التخزين المؤقت المشتركة ... والتي ستتم مزامنة تغييرات الكائن بين الخوادم ، ولكن لا يزال لديك مجموعتان من الحالات.

ألق نظرة على jbosscache. يتيح لك مشاركة/تكرار خرائط البيانات بسهولة بين مثيلات Mulitple JVM (نفس المربع أو مختلف). إنه سهل الاستخدام ولديه الكثير من خيارات بروتوكول مستوى الأسلاك (TCP ، UDP Multist ، إلخ).

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