Lekce 1 - Java RMI - Nastavení prostředí
Vítejte v seriálu o RMI (Remote Method Invocation), což je Java implementace techniky známé obecně pod zkratkou RPC (Remote Procedure Call). Co to je? Pokud si to přeložíme do češtiny, tak se jedná o "vzdálené volání metod". Prakticky se jedná o vlastnost JRE, virtuálního stroje Javy, který umožňuje volat metody (neboli spustit kód) na jiných vzdálených strojích (na LAN/ na MAN/ či WAN). Princip je velmi podobný socketové komunikaci ve verzi klient/server. Samotné volání metod je možné provádět z klienta na server nebo ze serveru volat klienta či klienty.
V některých literaturách se o RMI mluví jako o distribuovaných systémech. Proč? Protože přes RMI lze vcelku jednoduše naprogramovat výpočty, či požadované postupy pro více počítačů, tzv. distribuovat systém řešení (i DOS, DDOS útoky) neboli rozdělit práci na více strojů. Protože je Java přenositelná, není problém ani pokud je server Linux, Linux ARM, Mac OS X, Solaris a klient Windows a samozřejmě i naopak.
Využití v desktopové aplikaci je téměř mizivé, ale přes síť je možné spojit se s jiným Java programem běžícím na JRE a zavolat na něm předem naprogramované metody. Jak jsem výše uvedl, je to podobné principu socketů, ale v něčem mnohem lepší. Socket vám neumožňuje vybírat si přímo volání metod jak chcete, slouží pouze pro přenos dat (primitivní datové typy, objekty, proudy). Samozřejmě i RMI umí přenášet data. RMI funkčnost se dá využít při různých činnostech, např. ovládaní trojského koně, rozložit matematický výpočet na více klientů nebo clusterů, navrhnout softwarové řešení, kde je frontend jako desktop a backend využít přes RMI na cloudu apod.
Samozřejmě distribuované výpočty existovaly již před vznikem Javy a stále existují na konkurenčních platformách, např. CORBA (Common Object Request Broker Architecture), DCOM (Distributed Component Object Model) a obecné RPC.
RMI je čistě řešení Java SE a to je také i její nevýhodou. Není kompatibilní s jinými jazyky. Ovšem samozřejmě, že běží i v Java EE, kde má velmi identický koncept známý jako EJB (Enterprise Java Beans). Ve zkratce řečeno, RMI je taková jednodušší verze EJB, u kterého nepotřebujete žádný aplikační server. Když člověk pochopí jak funguje RMI, pak EJB již není zas takový problém. Tento kurz o RMI je o seznámení s danou technologií a ukázkami. V žádném případě neukazuje komplexnost a možnosti celé problematiky.
Nastavení prostředí
Takže začneme. Kurz je zpracován na Java 8 update 81, Windows 10 Pro 64bit a celkově pro 64bit prostředí. Protože je to Java, vše by mělo být kompatibilní a mělo by běžet i na 32bit prostředí. Samozřejmě pokud již máte něco z toho nainstalované, lze jednotlivé kroky přeskočit. V této lekci nás čeká pouze nastavení prostředí:
- Naistalujeme Javu (JDK a JRE) - toto je povinná část
- Naistalujeme IDE (Eclipse, NetBeans, IntelliJ IDEA, BlueJ, nebo lze i bez IDE apod.) - Pro řešení v kurzu bude využito Eclipse IDE
- Seznámíme se s RMI registry a nastavíme je
- Spustíme RMI registry - přes cmd, Eclipse IDE
Instalace Javy
Nainstalujeme Java SE z Oracle webu nebo z OpenJDK. Instalace je ukázána v tomto článku pro NetBeans nebo zde pro Eclipse. Samozřejmě nesmíme zapomenout nastavit systémovou proměnnou PATH. Na závěr je vhodné restartovat počítač.
Instalace IDE
Vybereme a stáhneme si IDE, které nám vyhovuje, může to být NetBeans, Eclipse, IntelliJ IDEA nebo BlueJ. Jak jsem již jednou napsal, seriál je řešen v Eclipse, ale je naprosto nepodstatné jaké IDE využijete.
Seznámení se, nastavení a spuštění RMI registry
RMI registry, co je to? Jedná se o *.exe soubor (v případě Windows),
který je nutno spustit s určitými
parametry (viz. Oracle dokumentace). Jeho spuštěním aktivujete službu
rmiregistry, která vám umožní spuštění a provádění RMI na JRE. RMI
registry se spouští pouze na serveru. Pokud všechny stroje v projektu
disponují funkcí serveru i klienta, je nutné, aby všechny měly spuštěné
rmiregistry. Program se nachází v adresáři
"adresář instalace Java\bin\
".
Spuštění RMI registry lze provést přes příkazový řádek (v případě Windows - CMD) nebo přes IDE. V každém případě je nutno definovat port, na kterém bude služba RMI registry naslouchat. Ve zkratce řečeno, port je identifikátor služby v TCP hlavičce packetu a je to prakticky číslo od 20 = 1 do 216 = 65556. Defaultní port pro RMI registry je 1099, ale samozřejmě si lze vybrat port na kterém služba poběží. Je zvykem podpůrným službám dávat port vyšší než 1024. Hodnoty portu od 1 od 1024 jsou vyhrazeny systémovým službám.
O IDE Eclipse toho psát moc nebudu. Jedná se o IDE (Integrated Development Environment), česky řečeno integrované vývojové prostředí pro programátory. Je zdarma a nemusí se instalovat, stačí jej nakopírovat. Jak se to dělá je ukázáno zde pro verzi Eclipse Mars. V mém případě využívám Eclipse EE, ale to není povinné, stačí i obyčejné Eclipse pro SE. Pro používání RMI není potřeba instalovat žádné IDE balíčky. Vše běží již v základním JRE. RMI registry se dají spustit více způsoby, např. přes CMD, IDE, programově, Windows registry, apod.
Spuštění RMI registry přes CMD
Takže jdeme do toho. Spustíme si RMI registry přes příkazový řádek CMD. V levém dolním rohu obrazovky klikneme na ikonu Windows pravým tlačítkem myši, v menu si vybereme Spustit, zadáme cmd a potvrdíme enterem. A abychom věděli jak službu OS registruje, spustíme si i správce úloh (CTRL + ALT + DEL - vybereme správce úloh) a přepneme na záložku procesy.
Pod Windows se rmiregistry spouští příkazem:
start rmiregistry
na defaultní portu 1099, ale my si je spustíme na našem zvoleném portu 2020 příkazem:
start rmiregistry 2020
A pod Linux nebo Solaris OS je příkaz:
rmiregistry 2020
Jak vidíte na výpisu procesů, vznikl nám nový proces "Java(TM) Platform SE Binary", což je označení pro JVM a objevilo se nové okno vyjadřující spuštění rmiregistrů. Dále si zkontrolujeme výpis portů, na kterých nasloucháme. Lze to řešit přes programy (např. Cports) nebo obyčejným systémovým příkazem "netstat -an". Jak vidíte, máme aktivní naslouchací port 2020 pro TCP.
Nabízí se logická otázka: Jak službu ukončíme? Přes správce úloh lze ukončit celý proces JVM, ale my zvolíme standardní řešení a to že nové okno rmiregistrů ukončíme obyčejným kliknutím na křížek okna. Jak vidíte, zmizí nám JVM ze správce úloh a pokud si dáme opět výpis portů, vidíme, že již na daném portu nenasloucháme.
Spuštění RMI registry přes Eclipse IDE
Nejdříve vytvoříme Java SE projekt. Protože jsem to již dělal v jiném seriálu, odkáži jen na příslušnou lekci. Nyní si provedeme nastavení RMI registrů pod Eclipse IDE. Vybereme si v menu možnost "Run -> External Tools -> External Tools Configurations".
Objeví se nám nový dialog a ve stromu v levém okně si vybereme "Program" a pravým tlačítkem myši vyvoláme kontextové menu a vybereme "New". Zde začneme provádět konfiguraci externího spouštěcího programu. Samozřejmě to lze udělat i pro jiné spustitelné programy (např. pod Windows typu *.exe).
- Name : RmiRegistry2020 - Nejdříve si danou konfiguraci pojmenujeme. Název si můžete zvolit libovolný.
- Location: C:\Program Files\JavaJDK\bin\rmiregistry.exe - Jako další je cesta k danému programu (rmiregistry.exe), který se nachází v \bin\ vaší instalace Javy.
- Working Directory: F:\Dokumenty\Java\ProjektRMI01\bin - Další je cesta k \bin\ našeho projektu (pracovní adresář), který jsme si vytvořili. Já mám daný projekt v "Dokumentech" na disku "F", v adresáři "Java". A protože se projekt jmenuje "ProjektRMI01", tak u mě cesta bude vypadat takto. Cesta u vás bude tedy jiná.
- Arguments: 2020 - Argumenty jsou parametry programu. V našem případě je to číslo portu, na kterém rmiregistry budou běžet (naslouchat).
Pak již jen zvolíme Apply a Run. Tímto spustíme RMI registry pod Eclipse.
Jak vidíte, v konzoli Eclipse (dolní část obrázku) jsou rmiregistry spuštěné. Pro jistotu jsem udělal i výpis portu přes "cmd", abychom viděli, že nasloucháme na portu 2020. Ukončení rmiregistrů přes Eclipse je jednoduché. Ukončíme je stejně jako běžící aplikaci a to červeným čtverečkem vpravo dole. Poté je ještě nutno kliknout na dvoj-křížek vpravo, vedle toho červeného křížku. Tím dvoj-křížkem odstraníte zastavený program ze spouštěče Eclipse.
V příští lekci, Java RMI - Volání void metod, si vytvoříme první příklad a zavoláme první vzdálenou metodu.