Komme i gang med Java RMI

1. Oversikt

Når to JVM-er trenger å kommunisere, er Java RMI ett alternativ vi har for å få det til. I denne artikkelen starter vi et enkelt eksempel som viser Java RMI-teknologi.

2. Opprette serveren

Det er to trinn som trengs for å opprette en RMI-server:

  1. Lag et grensesnitt som definerer klient / serverkontrakten.
  2. Lag en implementering av det grensesnittet.

2.1. Definere kontrakten

La oss først og fremst lage grensesnittet for det eksterne objektet. Dette grensesnittet utvider fjernkontroll markørgrensesnitt.

I tillegg kaster hver metode som er angitt i grensesnittet java.rmi.RemoteException:

offentlig grensesnitt MessengerService utvider Remote {String sendMessage (String clientMessage) kaster RemoteException; }

Merk imidlertid at RMI støtter hele Java-spesifikasjonen for metodesignaturer, så lenge Java-typene implementeres java.io.Serializable.

Vi får se i fremtidige seksjoner hvordan både klienten og serveren vil bruke dette grensesnittet.

For serveren lager vi implementeringen, ofte referert til som Eksternt objekt.

For klienten RMI-biblioteket vil dynamisk lage en implementering kalt a Stub.

2.2. Gjennomføring

Videre, la oss implementere det eksterne grensesnittet, igjen kalt Eksternt objekt:

offentlig klasse MessengerServiceImpl implementerer MessengerService {@Override public String sendMessage (String clientMessage) {return "Client Message" .equals (clientMessage)? "Servermelding": null; } offentlig streng unexposedMethod () {/ * kode * /}}

Legg merke til at vi har sluttet kasterRemoteException klausul fra metodedefinisjonen.

Det ville være uvanlig at vårt fjerntliggende objekt kastet et RemoteException siden dette unntaket vanligvis er reservert for RMI-biblioteket for å øke kommunikasjonsfeil til klienten.

Å utelate det har også fordelen av å holde implementeringen vår RMI-agnostisk.

Også, eventuelle tilleggsmetoder som er definert i det eksterne objektet, men ikke i grensesnittet, forblir usynlige for klienten.

3. Registrering av tjenesten

Når vi har opprettet ekstern implementering, må vi binde det eksterne objektet til et RMI-register.

3.1. Lage en stubbe

Først må vi lage en stubbe av det eksterne objektet:

MessengerService-server = ny MessengerServiceImpl (); MessengerService stub = (MessengerService) UnicastRemoteObject .exportObject ((MessengerService) server, 0);

Vi bruker det statiske UnicastRemoteObject.exportObject metode for å lage stubimplementeringen vår. Stubben er det som gjør magien med å kommunisere med serveren over den underliggende RMI-protokollen.

Det første argumentet til exportObject er det eksterne serverobjektet.

Det andre argumentet er porten som exportObject bruker for å eksportere det eksterne objektet til registeret.

Å gi en verdi på null indikerer at vi ikke bryr oss hvilken port exportObject bruksområder, som er typisk og så valgt dynamisk.

Dessverre, den exportObject () metoden uten portnummer avvikles.

3.2 Opprette et register

Vi kan opprette et register lokalt til serveren vår eller som en separat frittstående tjeneste.

For enkelhets skyld oppretter vi en som er lokal for serveren vår:

Registerregister = LocateRegistry.createRegistry (1099);

Dette oppretter et register som stubber kan bindes av servere og oppdages av klienter.

Vi har også brukt createRegistry metode, siden vi oppretter registeret lokalt til serveren.

Som standard kjører et RMI-register på port 1099. I stedet kan en annen port også spesifiseres i createRegistry fabrikkmetode.

Men i det frittstående tilfellet, ville vi ringe getRegistry, passerer vertsnavnet og portnummeret som parametere.

3.3 Binding av stubben

La oss derfor binde stubben vår til registeret. Et RMI-register er et navngivningsanlegg som JNDI osv. Vi kan følge et lignende mønster her og binde stubben vår til en unik nøkkel:

registry.rebind ("MessengerService", stub); 

Som et resultat er det eksterne objektet nå tilgjengelig for enhver klient som kan finne registeret.

4. Opprette klienten

Til slutt, la oss skrive klienten for å påkalle eksterne metoder.

For å gjøre dette, vil vi først finne RMI-registeret. I tillegg vil vi slå opp den eksterne objektstubben ved hjelp av den avgrensede unike nøkkelen.

Og til slutt vil vi påkalle sende melding metode:

Registerregister = LocateRegistry.getRegistry (); MessengerService server = (MessengerService) registry .lookup ("MessengerService"); Streng responseMessage = server.sendMessage ("klientmelding"); String expectMessage = "Servermelding"; assertEquals (expectMessage, responseMessage);

Fordi vi kjører RMI-registeret på den lokale maskinen og standardport 1099, sender vi ingen parametere til getRegistry.

Faktisk, hvis registeret er på en annen vert eller en annen port, kan vi levere disse parametrene.

Når vi har slått opp stubobjektet ved hjelp av registeret, kan vi påkalle metodene på den eksterne serveren.

5. Konklusjon

I denne veiledningen fikk vi en kort introduksjon til Java RMI og hvordan det kan være grunnlaget for klientserverapplikasjoner. Følg med for flere innlegg om noen av RMIs unike funksjoner!

Kildekoden til denne veiledningen finner du på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found