سؤال

لقد تلقيت مكالمة RMI محددة على النحو التالي:

public void remoteGetCustomerNameNumbers(ArrayList<String> customerNumberList, ArrayList<String> customerNameList) throws java.rmi.RemoteException;

تقوم الوظيفة بالبحث في قاعدة البيانات وتقوم بملء قائمتي ArrayLists.وظيفة الاتصال لا تحصل على شيء.أعتقد أن هذا يعمل مع أنواع المتجهات.

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

تحديث:
سأقبل جميع الإجابات المقدمة حتى الآن إذا استطعت.لم أكن أعرف تكلفة الشبكة، لذا فمن المنطقي إعادة صياغة الوظيفة لإرجاع LinkedHashMap بدلاً من قائمتي ArrayLists.

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

المحلول

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

نصائح أخرى

تستدعي الوسائط في RMI ملفًا تسلسليًا.يؤدي إلغاء التسلسل على الخادم إلى إنشاء نسخة من القوائم.إذا ظلت القوائم على جانب العميل، فسيكون عدد مكالمات الشبكة مرتفعًا جدًا.يمكنك تمرير كائنات بعيدة، لكن احذر من تأثيرات الأداء.

ستفقد مراجعك عند إجراء المكالمة عن بعد.ستحتاج إلى إرجاع القوائم بدلاً من توقع ملؤها عن طريق المكالمة عن بعد.

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

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

public ArrayList<String> getCustomerNames() throws java.rmi.RemoteException;

public ArrayList<String> getCustomerNumbers() throws java.rmi.RemoteException;

نظرًا لأن كلاً من ArrayList وString ينفذان Serializable، فسيتم إجراء تسلسل للنتائج في المجموعة وإرسالها عبر السلك إلى رمز العميل الذي يستدعي الطريقة، وعند هذه النقطة يمكنك العمل مع البيانات كما تريد.إذا كنت تريد بدلاً من ذلك استخدام كائن مخصص في المجموعة، فطالما أن فصلك يطبق الواجهة java.io.Serializable، ويتبع مواصفات تلك الواجهة، فلن تواجه أي مشاكل.

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

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