استدعاء الأساليب عن بعد في جافا

نموذج تنفيذ نموذجي لـ Java-RMI باستخدام كائنات stub و skeleton . وقد ألغى Java 2 SDK، الإصدار القياسي، الإصدار 1.2 الحاجة إلى كائن skeleton.

يُعد استدعاء الأساليب عن بعد في جافا ( Java RMI ) واجهة برمجة تطبيقات جافا تقوم باستدعاء الأساليب عن بعد ، وهو المكافئ الموجه للكائنات لاستدعاءات الإجراءات عن بعد (RPC)، مع دعم النقل المباشر لفئات جافا المتسلسلة وجمع القمامة الموزع .

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

قد يشير استخدام مصطلح RMI إلى واجهة البرمجة فقط أو قد يشير إلى كل من API و JRMP أو IIOP أو أي تطبيق آخر، في حين أن مصطلح RMI-IIOP (اقرأ: RMI عبر IIOP ) يشير تحديدًا إلى واجهة RMI التي تفوض معظم الوظائف إلى تطبيق CORBA الداعم .

إن الفكرة الأساسية لـ Java RMI، وبروتوكول جمع القمامة الموزع (DGC)، وجزء كبير من البنية الأساسية لتنفيذ Sun الأصلي، تأتي من ميزة "كائنات الشبكة" في Modula-3 .

رمز معمّم

قام مبرمجو واجهة برمجة تطبيقات RMI الأصلية بتعميم الكود نوعًا ما لدعم تطبيقات مختلفة، مثل بروتوكول HTTP . بالإضافة إلى ذلك، أُضيفت إمكانية تمرير الوسائط " بالقيمة " إلى CORBA لضمان التوافق مع واجهة RMI. مع ذلك، لا تزال واجهات تطبيقات RMI-IIOP وJRMP غير متطابقة تمامًا.

تأتي وظائف RMI ضمن الحزمة java.rmi، بينما يقع معظم تطبيق Sun ضمن sun.rmiالحزمة. تجدر الإشارة إلى أنه في إصدارات Java السابقة للإصدار 5.0، كان على المطورين تجميع نماذج RMI في خطوة تجميع منفصلة باستخدام rmic. أما في الإصدار 5.0 من Java والإصدارات الأحدث، فلم تعد هذه الخطوة مطلوبة، كما تم إيقاف استخدام النماذج الثابتة منذ Java 8.

نسخة جيني

تقدم جيني نسخة أكثر تطوراً من RMI في جافا. وهي تعمل بشكل مشابه ولكنها توفر أماناً أكثر تقدماً، وقدرات اكتشاف الكائنات، وآليات أخرى لتطبيقات الكائنات الموزعة . [ 1 ]

مثال

تقوم الفئات التالية بتنفيذ برنامج بسيط للعميل والخادم باستخدام RMI لعرض رسالة.

RmiServerIntfواجهة المستخدم
يُحدد هذا الواجهة التي يستخدمها العميل وينفذها الخادم. وهذا يُوسع الواجهة java.rmi.Remote، التي تُستخدم لتحديد فئة التنفيذ على أنها فئة تحتوي على طرق قابلة للاستدعاء عن بُعد.
package org.wikipedia.examples ;استيراد java.rmi.Remote ؛ استيراد java.rmi.RemoteException ؛public interface RmiServerIntf extends Remote { String getMessage () throws RemoteException ; }
RmiServerفصل
يستمع إلى طلبات RMI وينفذ الواجهة التي يستخدمها العميل لاستدعاء الطرق البعيدة.
package org.wikipedia.examples ;استيراد java.rmi.Naming ؛ استيراد java.rmi.RemoteException ؛ استيراد java.rmi.server.UnicastRemoteObject ؛ استيراد java.rmi.registry.* ؛public class RmiServer extends UnicastRemoteObject implements RmiServerIntf { public static final String MESSAGE = "Hello World" ;public RmiServer () throws RemoteException { super ( 0 ); // مطلوب لتجنب خطوة 'rmic'، انظر أدناه }public String getMessage () { return MESSAGE ; }public static void main ( String [] args ) throws Exception { System . out . println ( "تم تشغيل خادم RMI" );// معالج استثناء خاص لإنشاء السجل try { LocateRegistry.createRegistry ( 1099 ) ; System.out.println ( "تم إنشاء سجل Java RMI." ) ; } catch ( RemoteException e ) { // لا تفعل شيئًا؛ الخطأ يعني أن السجل موجود بالفعل System.out.println ( " سجل Java RMI موجود بالفعل." ) ; } // إنشاء مثيل لـ RmiServer RmiServer server = new RmiServer ();// ربط مثيل هذا الكائن بالاسم "RmiServer" Naming.rebind ( " // localhost/RmiServer" , server ) ; System.out.println ( " تم ربط PeerServer في السجل" ); } }
RmiClientفصل
هذا هو العميل الذي يحصل على مرجع (وكيل) للكائن البعيد الموجود على الخادم، ويستدعي دالته للحصول على رسالة. إذا تم تنفيذ كائن الخادم java.io.Serializableبدلاً من ذلك java.rmi.Remote، فسيتم تسلسله وتمريره إلى العميل كقيمة. [ 2 ]
package org.wikipedia.examples ;استيراد java.rmi.Naming ؛public class RmiClient { public static void main ( String [] args ) throws Exception { RmiServerIntf server = ( RmiServerIntf ) Naming . lookup ( "//localhost/RmiServer" ); System . out . println ( server . getMessage ()); } }

قبل تشغيل هذا المثال، نحتاج إلى إنشاء ملف "stub" للواجهة التي استخدمناها. لهذه المهمة، لدينا مُصرّف RMI - "rmic".

  • ملاحظة: نقوم بإنشاء ملف stub من ملف *.class الذي يحتوي على تنفيذ الواجهة البعيدة، وليس من ملف *.java .
خادم RMI

تجدر الإشارة إلى أنه منذ الإصدار 5.0 من J2SE، تمت إضافة دعم لملفات stub المُنشأة ديناميكيًا، ويتم توفير rmic فقط للتوافق مع الإصدارات السابقة من بيئات التشغيل، [ 3 ] أو للبرامج التي لا تُحدد رقم منفذ صريحًا (أو صفرًا) عند تصدير الكائنات البعيدة، وهو أمر ضروري لإنشاء ملفات stub، كما هو موضح في JavadocUnicastRemoteObject . راجع التعليق في الدالة البانية أعلاه .

مراجع

  1. تايلور، إيان جيه (2005). من الند للند إلى خدمات الويب والشبكات  : النظراء في عالم العميل/الخادم . اتصالات وشبكات الحاسوب. لندن: سبرينغر-فيرلاغ. doi : 10.1007/b138333 . ISBN 1852338695. OCLC 827073874 . 
  2. ويلسون، إم. جيف (10 نوفمبر 2000). "التعامل الذكي مع الوكلاء وRMI" . جافا وورلد . تم الاسترجاع في 18 يوليو 2020 .
  3. "ملاحظات إصدار Java RMI" . أوراكل . تم الاطلاع عليه بتاريخ 9 مايو 2012 .