Kategória: Java standard könyvtárak.
Table of Contents
|
Az internet megjelenésével alapvető fontosságúvá vált az, hogy a különböző számítógépeken levő programok egymással kommunikálni tudjanak. A számítógépes programok által nyújtott szolgáltatások alapvetően kétfélék lehetnek: az emberi felhasználók számára nyújtott szolgáltatások, és más számítógépek számára nyújtott szolgáltatások. Ugyanazt a szolgáltatást egyszerre mindkét interfészen nyújthatja, pl. egy hidrometeorológiai intézet a vízállás információkat megjelentetheti a honlapján az emberek számára, de lehetővé teheti a lekérdezést más számítógépek számára, pl. egy olyan portál számára, amely egy adott város melletti folyó vízállást jeleníti meg, az ugyanarra a városra jellemző, ugyancsak más rendszerből szerzett mondjuk közlekedés helyzettel együtt.
A Java-ban ez a terület (is) igen szerteágazó. Közülük némely része a Java standardnak, azok itt kerülnek bemutatásra, a többi a Java külső könyvtárak oldalon.
Távoli metódushívás
Első integrációs lépésként nézzük meg azt, hogy egy Java programból hogyan tudunk belehívni egy másik Java programba! A példában felállítunk egy matematika szervert, amely egyetlen függvényt nyújt: a square(n) négyzetre emeli a paraméterül kapott értéket. Ezt a programot elindítjuk, tehát önmagában fut, majd elkészítjük a klienst, amely egy másik Java virtuális gépből belehív az előzőbe, és kiírja az eredményül kapott számot. A példát a https://www.mkyong.com/java/java-rmi-hello-world-example/ leírás alapján készítettem.
A példaprogram bemutatása előtt lássunk néhány fontos fogalmat:
- RPC: a Remote Procedure Call, azaz távoli metódushívás rövidítése; ez a rövidítés bőven a Java előtt világba nyúlik vissza.
- RMI: a Remote Method Invocation, azaz távoli eljárás megszólítás rövidítése, ami az RMI Java megfelelője.
- JNDI: a Java Naming and Directory Interface rövidítése. Ez képezi a kapcsolatot a szerver és a kliens között. A szerver beregisztrálja magát ebbe a rendszerbe, tehát megad egy kulcsot, amin keresztül elérhető, valamint magát a megvalósuló osztályt, a kliens pedig a kulcs alapján lekérdezi azt. Ebben a példában csak az RMI-hez kapcsolódó névszolgáltatást használunk; a technológia ennél általánosabb, és a másik gyakori felhasználási területe az adatbázis vagy hálózati (DNS) erőforrások elérése.
A szervert és a klienst tipikusan külön szokás fejleszteni, külön projektben. Az interfészt mindkettő számára elérhetővé kell tenni. Erről a gyakorlatban tehát általában másolatot készítünk. A lenti példában (atipikus módon) olyan helyre tesszük, hogy azt elérje a szerver és a kliens is egyszerre. Az interfész a következő (megfelelő könyvtárba téve, megfelelő elnevezéssel):
package rmi.iface; import java.rmi.*; public interface MathInterface extends Remote { public int square(int n) throws RemoteException; }
A szerver kód:
package rmi.server; import java.rmi.*; import java.rmi.server.UnicastRemoteObject; import rmi.iface.MathInterface; public class MathServer extends UnicastRemoteObject implements MathInterface { private static final long serialVersionUID = 1L; protected MathServer() throws RemoteException { super(); } @Override public int square(int n) throws RemoteException { int result = n * n; System.out.println("[MathServer] square(" + n + ") = " + result); return result; } public static void main(String args[]) { try { Naming.rebind("//localhost/MathServer", new MathServer()); System.out.println("Math server ready"); } catch (Exception e) { e.printStackTrace(); } } }
A Naming.rebind() eljárást használjuk a regisztráláshoz. A kliens:
package rmi.client; import java.rmi.Naming; import rmi.iface.MathInterface; public class MathClient { public static void main(String args[]) { try { MathInterface mathInterface = (MathInterface) Naming.lookup("//localhost/MathServer"); System.out.println("[MathClient] square(5) = " + mathInterface.square(5)); } catch (Exception e) { e.printStackTrace(); } } }
A Naming.lookup() keresi meg az eljárást, amit meghív.
A futtatáshoz el kell indítanunk az RMI registry programot, ami a Java része, mégpedig a szerver binárisának gyökeréből. A fenti példában a MathServer.class bináris egy rmi/server/ könyvtárban helyezkedik el; tehát abból a könyvtárból kell indítanunk az RMI registry-t, ahol a kilistázzuk a könyvtár tartalmát, akkor egy rmi-t látunk. Ez lehet a bin/ vagy a target/classes/. Az RMI registry indítása:
start rmiregistry
Normál esetben egy új, teljesen fekete ablakban jelenik meg az RMI registry. Ezt követően indíthatjuk szokásosan a szervert (java rmi.server.MathServer), majd egy másik ablakból a klienst (java rmi.server.MathClient).
Integráció más programozási nyelvekkel
A CORBA az a rendszer, amellyel kapcsolatot lehet létrehozni két programozási nyelv között. Ennek a technológiának a segítségével például Javaból meg tudunk hívni egy C++ függvényt vagy fordítva. Noha régi fényét már elveszítette, helyét átvették a HTTP alapú web szolgáltatások, szükség esetén itt találunk egy leírást a használatáról: https://docs.oracle.com/javase/7/docs/technotes/guides/idl/jidlExample.html.
Web szolgáltatások
A Java többféle web szolgáltatást nyújt. Noha mindez Java szinten specifikált, az írás pillanatában nincs olyan módszer, amit külső könyvtár nélkül is meg tudunk oldani, így mindet a Java külső könyvtárak oldalon tárgyaljuk.