===== Egyszerű Java-RMI példa ===== Először is, készítsünk egy interakciós diagramot, ami bemutatja, hogyan kommunikál egymással a **Client** és a **RObject** a **RegisterService**-en keresztül: sequenceDiagram participant C as Client participant RS as RegisterService participant RO as RObject participant RMI as RMI Registry RS->>RMI: Register RObject RMI-->>RS: RObject Registered C->>RMI: Lookup RObjectServer RMI-->>C: Return RObject C->>RO: primitiveArg(2012) RO-->>C: Acknowledge C->>RO: argumentByValue(2012) RO-->>C: Acknowledge Ez a diagram szemlélteti a folyamat lépéseit: a RegisterService regisztrálja az RObject-et az RMI Registry-ben, a Client lekérdezi a távoli objektumot, majd használja annak funkcióit. Most pedig nézzük meg, hogyan néz ki ez a rendszer egy struktúra diagramon, ami bemutatja a komponensek és azok kapcsolatait: graph TD subgraph "RMI Registry" RO[RObject Interface] end subgraph "Server Side" ROS[RObjectImpl] -- Implements --> RO end subgraph "Client Side" C[Client] -- Uses --> RO end RegisterService -- Registers --> RO C -- Looks up --> RO C -- Calls methods on --> ROS A struktúra diagram világosan ábrázolja a rendszer különböző részeit és azok közötti kapcsolatokat: A Server Side rész tartalmazza az **RObjectImpl** implementációt, amely megvalósítja az **RObject** interfészt. Az **RMI Registry** regisztrálja az interfészt, lehetővé téve, hogy a **Client Side**-on lévő **Client** megtalálja és használja azt. A **Client** a távoli objektum (ROS) metódusait hívja meg, ami ábrázolja a két fő műveletet: egy primitív és egy érték szerinti paraméter átadást. **Megvalósítás:** Telepítsük a gradle-t innen: https://gradle.org/releases/ A //bin// könyvtárat adjuk hozzá a //PATH//-hoz. A teljes forráskód elérhető itt: git clone https://github.com/knehez/isi.git cd java_rmi Nyissunk két terminált, az egyikben: gradle runRegisterService A másikban: gradle run A program részletesen: 1.) Definiáljuk az RObject interfészeket, mindkettő implementálja a Remote interfészt package org.ait; import java.rmi.*; public interface RObject extends Remote { // egyszerű paraméterátadás void primitiveArg(int num) throws RemoteException; // érték szerinti paraméterátadás void argumentByValue(Integer num) throws RemoteException; } 2.) Implementáljuk a távoli objektumok kódját package org.ait; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class RObjectImpl extends UnicastRemoteObject implements RObject { private static final long serialVersionUID = 6350331764929058681L; public RObjectImpl() throws RemoteException { } @Override public void primitiveArg(int num) throws RemoteException { System.out.println(num); } @Override public void argumentByValue(Integer num) throws RemoteException { System.out.println(num); } } 3.) Indítsuk el az RMI registry-t. Ez egy Java JDK komponens, elindítani a létrehozott projekt **/bin** könyvtárából kell. > rmiregistry.exe 4.) Hozzuk létre egy példányát a távoli objektumnak és kössük hozzá a registry-hez package org.ait; import java.rmi.Naming; public class RegisterService { /** * @param args */ public static void main(String[] args) { try { RObject robj = new RObjectImpl(); Naming.rebind("rmi://localhost:1099/RObjectServer", robj); System.out.println("Registered..."); } catch (Exception e) { e.printStackTrace(); } } } Indítsuk el a RegisterService-t, ha fut a rmiregistry, csak akkor fog tudni regisztrálni. 5.) Használjuk a távoli objektumot Indítsuk el az alábbi kódot. package org.ait; import java.rmi.Naming; public class Client { public static void main(String[] args) { try { // Távoli objektum lekérése a registry-ből RObject robj = (RObject) Naming.lookup("rmi://localhost:1099/RObjectServer"); // Egyszerű argumentum robj.primitiveArg(2012); // Serilaizált argumentum robj.argumentByValue(new Integer(2012)); } catch (Exception e) { e.printStackTrace(); ; } } }