Početak rada s Java RMI

1. Pregled

Kada dva JVM-a trebaju komunikaciju, Java RMI je jedna od mogućnosti koju moramo ostvariti. U ovom ćemo članku pokrenuti jednostavan primjer koji prikazuje Java RMI tehnologiju.

2. Izrada poslužitelja

Dva su koraka potrebna za stvaranje RMI poslužitelja:

  1. Stvorite sučelje definirajući ugovor klijent / poslužitelj.
  2. Stvorite implementaciju tog sučelja.

2.1. Definiranje ugovora

Prije svega, kreirajmo sučelje za udaljeni objekt. Ovo sučelje proširuje java.rmi.Udaljeno sučelje markera.

Uz to, svaka metoda deklarirana u sučelju baca java.rmi.RemoteException:

javno sučelje MessengerService proširuje Remote {String sendMessage (String clientMessage) baca RemoteException; }

Ipak, imajte na umu da RMI podržava potpunu Java specifikaciju za potpise metoda, sve dok Java tipovi implementiraju java.io.Serializable.

U budućim ćemo odjeljcima vidjeti kako će i klijent i poslužitelj koristiti ovo sučelje.

Za poslužitelj ćemo stvoriti implementaciju, koja se često naziva i Udaljeni objekt.

Za klijenta, RMI knjižnica će dinamički stvoriti implementaciju koja se naziva a Stub.

2.2. Provedba

Nadalje, implementiramo udaljeno sučelje, ponovno nazvano Udaljeni objekt:

javna klasa MessengerServiceImpl implementira MessengerService {@Override javni niz sendMessage (String clientMessage) {return "Client Message" .equals (clientMessage)? "Poruka poslužitelja": null; } javni StringexposedMethod () {/ * kôd * /}}

Primijetimo, da smo zaustavili bacaRemoteException klauzula iz definicije metode.

Bilo bi neobično da naš udaljeni objekt baci a RemoteException budući da je ova iznimka obično rezervirana za RMI knjižnicu kako bi klijentu javljala komunikacijske pogreške.

Ako ga izostavimo, korist je i u tome što je naša implementacija RMI-agnostička.

Također, sve dodatne metode definirane u udaljenom objektu, ali ne i u sučelju, ostaju nevidljive za klijenta.

3. Registriranje usluge

Jednom kada kreiramo udaljenu implementaciju, moramo povezati udaljeni objekt s RMI registrom.

3.1. Stvaranje Stuba

Prvo, moramo stvoriti krpu našeg udaljenog objekta:

MessengerService server = novi MessengerServiceImpl (); MessengerService stub = (MessengerService) UnicastRemoteObject .exportObject ((MessengerService) poslužitelj, 0);

Koristimo statiku UnicastRemoteObject.exportObject metoda za stvaranje naše implementacije kradljivice. Stab je ono što čini čaroliju komunikacije s poslužiteljem preko temeljnog RMI protokola.

Prvi argument za exportObject je objekt udaljenog poslužitelja.

Drugi je argument luka koja exportObject koristi za izvoz udaljenog objekta u registar.

Davanje vrijednosti nule znači da nas ne zanima koji port exportObject koristi, što je tipično i tako je dinamički odabrano.

Nažalost, exportObject () metoda bez broja porta je zastarjela.

3.2 Stvaranje registra

Možemo uspostaviti lokalni registar na našem poslužitelju ili kao zasebnu samostalnu uslugu.

Radi jednostavnosti stvorit ćemo onu koja je lokalna za naš poslužitelj:

Registar registra = LocateRegistry.createRegistry (1099);

To stvara registar na koji poslužitelji mogu vezati kvarove i otkriti ih klijenti.

Također, koristili smo i createRegistry metodom, jer kreiramo lokalni registar na poslužitelju.

Prema zadanim postavkama, RMI registar radi na portu 1099. Umjesto toga, drugi port može se navesti u createRegistry tvornička metoda.

Ali u samostalnom slučaju nazvali bismo getRegistry, prosljeđujući ime i broj porta kao parametre.

3.3 Vezivanje stuba

Slijedom toga, hajde da povežemo svoj krad s registrom. RMI registar je objekt za imenovanje poput JNDI itd. Ovdje možemo slijediti sličan obrazac, vežući svoj stub za jedinstveni ključ:

registry.rebind ("MessengerService", klat); 

Kao rezultat toga, udaljeni je objekt sada dostupan svakom klijentu koji može pronaći registar.

4. Stvaranje klijenta

Na kraju, napišimo klijenta da pozove udaljene metode.

Da bismo to učinili, prvo ćemo pronaći RMI registar. Osim toga, potražit ćemo udaljeni objektni objekt koristeći ograničeni jedinstveni ključ.

I na kraju, pozvat ćemo se na Pošalji poruku metoda:

Registar registra = LocateRegistry.getRegistry (); MessengerService server = (MessengerService) registar .lookup ("MessengerService"); String responseMessage = server.sendMessage ("Poruka klijenta"); String očekujeMessage = "Poruka poslužitelja"; assertEquals (očekuje seMessage, responseMessage);

Budući da pokrećemo RMI registar na lokalnom računalu i zadanom portu 1099, ne prosljeđujemo nikakve parametre getRegistry.

Zapravo, ako je registar na drugom hostu ili na drugoj luci, možemo dostaviti ove parametre.

Jednom kada pretražimo stub objekt pomoću registra, možemo pozvati metode na udaljenom poslužitelju.

5. Zaključak

U ovom uputstvu dobili smo kratki uvod u Java RMI i kako on može biti temelj za klijent-poslužiteljske aplikacije. Pratite dodatne postove o nekim jedinstvenim značajkama RMI-ja!

Izvorni kod ovog vodiča možete pronaći na GitHubu.