תחילת העבודה עם Java RMI

1. סקירה כללית

כאשר שני JVMs צריכים לתקשר, Java RMI הוא אפשרות אחת שעלינו לגרום לזה לקרות. במאמר זה אנו מתחילים לדוגמא פשוטה המציגה את טכנולוגיית Java RMI.

2. יצירת השרת

ישנם שני שלבים הדרושים ליצירת שרת RMI:

  1. צור ממשק המגדיר את חוזה הלקוח / השרת.
  2. צור יישום של ממשק זה.

2.1. הגדרת החוזה

קודם כל, בואו ניצור את הממשק לאובייקט המרוחק. ממשק זה מרחיב את java.rmi.Remote ממשק סמן.

בנוסף, כל שיטה המוצהרת בממשק זורקת את java.rmi.RemoteException:

ממשק ציבורי MessengerService מרחיב מרחוק {String sendMessage (String clientMessage) זורק RemoteException; }

שים לב, עם זאת, RMI תומך במפרט הג'אווה המלא לחתימות שיטות, כל עוד סוגי הג'אווה מיושמים java.io.Serializablה.

נראה בחלקים הבאים בעתיד, כיצד הלקוח והשרת ישתמשו בממשק זה.

עבור השרת ניצור את היישום, המכונה לעתים קרובות ה- אובייקט מרוחק.

עבור הלקוח, ספריית RMI תיצור באופן דינמי יישום הנקרא a בָּדָל.

2.2. יישום

יתר על כן, בואו נשתמש בממשק המרוחק, שנקרא שוב אובייקט מרוחק:

מחלקה ציבורית MessengerServiceImpl מיישמת את MessengerService {@Override Public String sendMessage (String clientMessage) {להחזיר "הודעת לקוח". שווה (clientMessage)? "הודעת שרת": null; } מחרוזת ציבורית unexposedMethod () {/ * code * /}}

שימו לב, שהפסקנו את זורקRemoteException סעיף מהגדרת השיטה.

זה יהיה יוצא דופן שהחפץ הרחוק שלנו זורק א RemoteException מכיוון שחריג זה שמור בדרך כלל לספריית RMI כדי להעלות שגיאות תקשורת ללקוח.

להשאיר את זה יש גם את היתרון בשמירה על יישום ה- RMI שלנו.

גַם, כל שיטות נוספות המוגדרות באובייקט המרוחק, אך לא בממשק, נותרות בלתי נראות עבור הלקוח.

3. רישום השירות

ברגע שניצור את היישום המרוחק, עלינו לאגד את האובייקט המרוחק לרישום RMI.

3.1. יצירת סטאב

ראשית, עלינו ליצור גבעול של האובייקט המרוחק שלנו:

שרת MessengerService = MessengerServiceImpl חדש (); MessengerService stub = (MessengerService) UnicastRemoteObject .exportObject ((MessengerService) שרת, 0);

אנו משתמשים בסטטי UnicastRemoteObject.exportObject שיטה ליצירת היישום שלנו. הסטאב הוא מה שעושה את הקסם בתקשורת עם השרת באמצעות פרוטוקול RMI הבסיסי.

הוויכוח הראשון ל exportObject הוא אובייקט השרת המרוחק.

הטיעון השני הוא הנמל ש exportObject משתמש לייצוא האובייקט המרוחק לרישום.

מתן ערך אפס מציין שלא אכפת לנו באיזו יציאה exportObject שימושים, האופייניים וכל כך נבחרים באופן דינמי.

לצערנו, ה exportObject () השיטה ללא מספר יציאה הוצאה משימוש.

3.2 יצירת רישום

אנו יכולים להקים רישום מקומי לשרת שלנו או כשירות עצמאי נפרד.

לשם פשטות, ניצור אחד המקומי לשרת שלנו:

רישום הרישום = LocateRegistry.createRegistry (1099);

זה יוצר רישום שאליו ניתן לאגד את stubs על ידי שרתים ולגלות אותו על ידי לקוחות.

כמו כן, השתמשנו ב- createRegistry שיטה, מכיוון שאנחנו יוצרים את הרישום המקומי לשרת.

כברירת מחדל, רישום RMI פועל ביציאה 1099. במקום זאת, ניתן לציין גם יציאה אחרת ב createRegistry שיטת מפעל.

אבל במקרה העצמאי, היינו מתקשרים getRegistry, העברת שם המארח ומספר היציאה כפרמטרים.

3.3 כריכת הדל

כתוצאה מכך, בואו נקשר את הדאבל שלנו לרישום. רישום RMI הוא מתקן למתן שמות כמו JNDI וכו '. אנו יכולים לעקוב אחר דפוס דומה כאן, המחייב את הדאב שלנו למפתח ייחודי:

registry.rebind ("MessengerService", stub); 

כתוצאה מכך, האובייקט המרוחק זמין כעת לכל לקוח שיכול לאתר את הרישום.

4. יצירת הלקוח

לסיום, בואו נכתוב את הלקוח כדי להפעיל את השיטות המרוחקות.

לשם כך נאתר תחילה את רישום ה- RMI. בנוסף, נחפש את גזע האובייקט המרוחק באמצעות המפתח הייחודי המגביל.

ולבסוף, נפעיל את לשלוח הודעה שיטה:

רישום הרישום = LocateRegistry.getRegistry (); שרת MessengerService = (MessengerService) הרישום .look ("MessengerService"); מחרוזת responseMessage = server.sendMessage ("הודעת לקוח"); String expectMessage = "הודעת שרת"; assertEquals (expectMessage, responseMessage);

מכיוון שאנחנו מריצים את הרישום RMI במחשב המקומי ויציאת ברירת המחדל 1099, אנו לא מעבירים פרמטרים כלשהם getRegistry.

ואכן, אם הרישום נמצא במקום מארח אחר או יציאה אחרת, אנו יכולים לספק פרמטרים אלה.

לאחר שנבדוק את אובייקט ה- stub באמצעות הרישום, נוכל להפעיל את השיטות בשרת המרוחק.

5. מסקנה

במדריך זה קיבלנו היכרות קצרה עם Java RMI וכיצד הוא יכול להיות הבסיס ליישומי שרת לקוח. הישאר מעודכן לפוסטים נוספים על כמה מהתכונות הייחודיות של RMI!

את קוד המקור של הדרכה זו ניתן למצוא באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found