Integrációs lehetőségek Javában

Kategória: Java standard könyvtárak.

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.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License