JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko



Samankaltaiset tiedostot
Verkko-ohjemointia. TCP vs. UDP Socket, ServerSocket Datagrammit RMI

RMI TOIMIVAA ETÄPROSEDUURIOHJELMINTIA

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Rajapinta (interface)

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

4. Luokan testaus ja käyttö olion kautta 4.1

Mikä yhteyssuhde on?

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

14. Poikkeukset 14.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

1 Tehtävän kuvaus ja analysointi

Java-API, rajapinnat, poikkeukset, UML,...

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

Luokat ja oliot. Ville Sundberg

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

9. Periytyminen Javassa 9.1

Ohjelmoinnin jatkokurssi, kurssikoe

14. Poikkeukset 14.1

Javan perusteita. Janne Käki

Olio-ohjelmointi Virhetilanteiden käsittely

9. Periytyminen Javassa 9.1

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

OHJ-5010 Hajautettujen järjestelmien perusteet

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Metodien tekeminen Javalla

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Poikkeustenkäsittely

Ohjelmointi 2 / 2010 Välikoe / 26.3

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

8. Näppäimistöltä lukeminen 8.1

16. Javan omat luokat 16.1

SATAKUNNAN AMMATTIKORKEAKOULU. Minna Seppi TIEDOSTOPALVELU RMI-TEKNIIKALLA

Pakkauksen kokoaminen

HOJ RMI = Remote Method Invocation

HOJ J2EE & EJB & SOAP &...

2. Olio-ohjelmoinista lyhyesti 2.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Olio-ohjelmointi Javalla

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Osio 4: Tietovirrat. Properties- eli ominaisuustiedostot Logger: lokitietojen käsittely

Liite 1. Projektin tulokset (Semaforit Javassa) Jukka Hyvärinen Aleksanteri Aaltonen

7. Oliot ja viitteet 7.1

8. Näppäimistöltä lukeminen 8.1

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Luento 6. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

Integrointi. Ohjelmistotekniikka kevät 2003

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

12. Näppäimistöltä lukeminen 12.1

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

Listarakenne (ArrayList-luokka)

Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter

7. Näytölle tulostaminen 7.1

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

Java kahdessa tunnissa. Jyry Suvilehto

Taulukot. Jukka Harju, Jukka Juslin

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

4. Olio-ohjelmoinista lyhyesti 4.1

Pakkauksen kokoaminen

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

HSMT J2EE & EJB & SOAP &...

11/20: Konepelti auki

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

15. Ohjelmoinnin tekniikkaa 15.1

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Rinnakkaisohjelmointi, Syksy 2006

1. Omat operaatiot 1.1

Luokkamalli LUOKKAKAAVIO. Tämän osan sisältö. Luokkamalli. Luokka ja olio. Luokkakaavio (class diagram)

Delegaatit ja tapahtumakäsittelijät

15. Ohjelmoinnin tekniikkaa 15.1

Operaattorin ylikuormitus ja käyttäjän muunnokset

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

19. Olio-ohjelmointia Javalla 19.1

Ohjelmoinnin peruskurssien laaja oppimäärä

5. HelloWorld-ohjelma 5.1

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

Microsoft Visual J++ ohjelmointiympäristö

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

Transkriptio:

JavaRMI 1 JAVA RMI Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko

JavaRMI 2 Table of Contents...1 JAVA RMI...1 Yleistä...4 Arkkitehtuuri...5 Java RMI kerrosarkkitehtuuri...5 Tynkä (stub)...5 Etäviittauskerros...6 Kuljetuskerros...6 Java RMI API...6 Remote...6 RemoteException...6 RemoteObject -luokka...7 RMI koodin keinoin...7 Etäkutsuttavat metodit sisältävä rajapinta...7 Tynkärajapinnan toteuttava luokka...8 RMI-palvelimen kirjoittaminen...9 RMI-asiakkaan kirjoittaminen...10 Esimerkin kääntäminen...11 Ajaminen...11 Yhteenveto...11 Lähteet...12

JavaRMI 3 1. Yleistä Hajautettujen ohjelmien tulee voida kommunikoida keskenään jotenkin, jotta ne toimisivat oikein. Yleisesti tällaisia kommunikointitapoja ovat esimerkiksi socketit ja RPC:t. Javan vastine RPC:lle on luokkakokoelma, joka mahdollistaa toisella Javan virtuaalikoneella sijaitsevan luokan metodin kutsumisen samaan tapaan kuin samalla virtuaalikoneella sijaitsevien olioidenkin palveluiden kutsumisen. Tämä Javan tarjoama luokkakirjasto, java.rmi, määrittelee, kuinka nämä eri paikoissa sijaitsevat ohjelmat kommunikoivat, joten ohjelmoija säästyy socketien ohjelmoinnilta. Tämä mahdollistaa Javan idean laajentamisen. Ohjelmoi kerran, käytä missä vain muuttuu muotoon: ohjelmoi kerran, käytä kaikkialla. Java RMI -luokan tarjoamien palveluiden voima piilee siinä, että metodien lisäksi voidaan lähettää luokkamäärityksiä ja käyttäytymismalleja. RMI lähettää olioita omassa muodossaan, joten olioiden käyttäytyminen ei muutu lähetyksen jälkeen toisella JVM:llä. Tämä mahdollistaa uusien oliotyyppien ja käyttäytymisten esittelyn toisessa JVM:ssä ja siten laajentaa sovelluksen käyttömahdollisuuksia. RMI sisältää kaksi erillistä ohjelmaa, palvelimen ja asiakkaan. Palvelin tyypillisesti luo joitakin etäolioita, mahdollistaa näiden olioiden viitteiden saatavuuden ja odottaa asiakkaan herättävän näiden olioiden metodeita. Tyypillisesti asiakas hankkii etäviitteen yhteen tai useampaan etäolioon palvelimella ja sitten kutsuu niiden metodeja. RMI tarjoaa asiakkaan ja palvelimen välisen kommunikoinnin ja tietojen välittämisen niiden välillä. Hajautettujen sovellusten täytyy paikallistaa etäoliot. Paikallisten sovellusten on siis hankittava etäolioiden viitteet jollakin tavalla ja tähän tarkoitukseen sovelluksilla on erilaisia mekanismeja. Sovellus voi esimerkiksi rekisteröidä etäolionsa RMI:n yksinkertaiseen nimiavaruuteen eli RMI rekisteriin tai sovellus voi lähettää ja vastaanottaa etäolioviitteitä osana etäkutsuja. Hajautettujen sovellusten täytyy myös pystyä kommunikoimaan etäolioiden kanssa. RMI huolehtii kommunikoinnin yksityiskohdista. Ideana RMI:n kehittämiselle olikin, että ohjelmoijalle etämetodien käyttö olisi yhtä helppoa kuin paikallistenkin metodien kutsuminen ja ohjelmoijalle kommunikaatio näyttääkin samalta kuin normaalit paikalliset metodikutsut. 2. Arkkitehtuuri Kuten muutkin Java-sovellukset, hajautetut sovelluksetkin, jotka on tehty käyttäen Java RMI:tä, koostuvat rajapinnoista ja luokista. Rajapinnat esittelevät luokat ja luokkien palvelut. Luokat toteuttavat nämä esitellyt palvelut. Hajautetussa sovelluksessa toteutukset voivat sijaita joissain JVM:issä, mutta eivät välttämättä toisissa. Olioita, joilla on metodeja, joita voidaan kutsua toisista JVM:ista, kutsutaan etäolioiksi. Etäolio toteuttaa etärajapinnan (remote interface), joka laajentaa java.rmi.remote-rajapintaa ja jokainen rajapinnan metodi määrittelee poikkeuksen (java.rmi.exception). RMIn toteuttavat luokat voivat sallia rinnakkaisuuden ja säikeiden käytön. RMI ei kuitenkaan takaa säikeiden oikeaa toimintaa. Koska samaan etäolioon voi kohdistua rinnakkaisia etämetodikutsuja, on etäolion toteutuksessa varmistettava, että se on säieturvallinen.

JavaRMI 4 2.1. Java RMI kerrosarkkitehtuuri Javan RMI on toteutettu kolmena kerroksena, joita ovat Stub ja Skeleton kerros, etäviittauskerros ja kuljetuskerros. Java2 SDK:ta käyttävissä sovelluksissa skeletonia ei tarvitse enää toteuttaa. Lisäksi arkkitehtuuriin voidaan laskea aiemmin mainittu sovelluskerros. Sovelluskerroksessa sijaitsevat asiakas ja palvelinohjelmat. Asiakkaalla on käytössään rajapinta, palvelimella rajapinta sekä toteuttavat luokat. Sovelluskerroksen alapuolella sijaitsee RMI. 2.1.1. Tynkä (stub) Tynkäkerros on rajapinta sovelluskerroksen ja RMI järjestelmän välillä. Kerroksen tehtävänä on välittää dataa seuraavana alapuolella olevalle etäviittauskerrokselle ns. marshal-streamien (marshal streams, marshaling, järjestäminen) avulla. Näin toimitaan myös toiseen suuntaan: kerros välittää dataa ylemmälle kerrokselle (sovellukselle), unmarshaloi datan. Marshaling tarkoittaa prosessia jolla korkean tason dataa muutetaan muotoon, joka sopii sellaisenaan tiedonsiirtoon. Unmarshaling tarkoittaa prosessia joka jäsentää vastaanotetun tiedon jälleen samaksi korkean tason dataksi. RMI:ssä marshalling mekanismi käyttää hyväksi Javan olioiden sarjallistamismekanismia (object serialization), joka mahdollistaa olioiden siirtämisen eri osoiteavaruuteen. (Pastila 2003) Java RMI kohtelee etäolioita erilailla kuin paikallisia olioita, kun niitä lähetetään JVM:ltä toiselle. Asiakkaalle lähetetään olion kopion sijasta tynkä, joka toimii olion paikallisena edustajana ja toimii itse asiassa etäviitteenä asiakkaalle. Asiakas kutsuu metodia paikallisessa tyngässä ja tynkä huolehtii metodin kutsumisesta etäoliossa. Tynkä toteuttaa etäoliolle samat etärajapinnat kuin etäolio toteuttaa. Tämä ominaisuus mahdollistaa minkä tahansa etäolion toteuttaman rajapinnan kutsumisen tyngän avulla. Kuitenkin, vain ne metodit, jotka on määritelty etärajapinnassa ovat kutsuttavissa vastaanottavasta JVM:stä. 2.1.2. Etäviittauskerros Etäviittauskerros (remote reference layer) on vastuussa erityisen etäviittaus protokollan toteutuksesta. Tämä protokolla on riippumaton asiakkaan stubeista ja palvelimen skeletoneista. Etäviittauskerros käyttää kuljetuskerroksen palveluita. 2.1.3. Kuljetuskerros Kuljetuskerros luo varsinaisen tietoliikenneyhteyden kahden virtuaalikoneen välille. Kaikki yhteydet ovat stream-perustaisia TCP/IP yhteyksiä. Vaikka nämä virtuaalikoneet sijaitsisivat fyysisesti samalla tietokoneella, ovat ne yhteydessä kyseisen tietokoneen TCP/IP -protokollapinon kautta.

JavaRMI 5 3. Java RMI API Rajapinnat ja luokat määrittelevät RMI-systeemin toiminnan. Oheinen kuva esittää, kuinka keskeisimmät RMI-luokan rajapinnat ja luokat liittyvät toisiinsa. 3.1. Remote RMI:ssä remote-rajapinta esittelee metodit, joita voidaan kutsua toisita JVM:istä. Etärajapinnan tulee ainakin laajentaa, joko suoraan tai epäsuorasti java.rmi.remote-rajapintaa. Jokaisen etärajapinnan tai sen ylirajapinnan metodin tulee sisältää java.rmi.exception tai sen yliluokan poikkeusmäärittely. Etämetodimäärittelyssä, jos metodin parametrina tai paluuarvona on olio, on tämä olio määriteltävä rajapintana, ei toteuttavana luokkana. Remote-rajapinta ei määrittele mitään metodeja. Etärajapinnan on laajennettava ainakin java.rmi.remote -rajapintaa. Etärajapinta voi myös laajentaa paikallista rajapintaa, jos kaikki tämän toisen rajapinnan metodit täyttävät etämetodien määrittelyjen vaatimukset. Esimerkiksi etärajapinta Beta laajentaa sekä paikallista Alpha-rajapintaa sekä java.rmi.remoterajapintaa: Alpha public interface Alpha { public final String okay = "constants are okay too"; public Object foo(object obj) throws java.rmi.remoteexception; public void bar() throws java.io.ioexception; public int baz() throws java.lang.exception;

JavaRMI 6 public interface Beta extends Alpha, java.rmi.remote { public void ping() throws java.rmi.remoteexception; (http://java.sun.com/javase/6/docs/platform/rmi/spec/rmi-objmodel5.html) 3.2. RemoteException RemoteException -luokka on RMI:n etäkutsujen suoritusaikaisten poikkeusten yliluokka. Jokaisen etämetodin on määriteltävä java.rmi.remoteexception tai joku sen yliluokista esim. java.io.ioexception omassa throws-lauseessaan. Poikkeus heitetään, jos etämetodikutsu epäonnistuu jostakin syystä. Näitä syitä voivat olla esimerkiksi yhteysvirhe, parametrin tai paluuarvon marshalloinnin epäonnistuminen tai protokollavirheet. 3.3. RemoteObject -luokka RemoteObject-luokka ja sen aliluokat java.rmi.server.remoteserver, java.rmi.server.unicastremoteobject ja java.rmi.activation.activatable tarjoavat RMI:n palvelimen toiminnot. 4. RMI koodin keinoin. Yksi javan merkittävimmistä ominaisuuksista on mahdollisuus ladata Java-koodia mistä tahansa URL:stä ja suorittaa sitä paikallisessa VM:ssä. Tämä ominaisuus on ollut käytössä jo kauan selaimissa, joissa ajettu VM voi ladata verkon yli mitä tahansa luokan java.applet.applet aliluokkia ja suorittaa ne. Myös java RMI hyödyntää tätä ominaisuutta ja mahdollistaa luokkien lataamisen ja suorittamisen missä tahansa VM:ssä. Yksi dynaamisen koodin latauksen keskeisistä RMI:n ominaisuuksista on mahdollisuus ladata myös luokkamäärittelyt, jos luokkaa ei ole määritelty vastaanottajan JVM:ssä. Kaikki oliotyypit ja niiden käyttäytyminen, mitkä ovat aiemmin olleet saatavilla vain paikallisesti yhdeltä JVM:ltä, voidaan lähettää toiselle, mahdollisesti toisella koneella sijaitsevalle JVM:lle. Seuraavaksi rakennetaan esimerkki, jossa asiakasohjelma lataa dynaamisesti rmirekisteristä Laskin luokan, jolla se suorittaa muutamia triviaaleja laskutoimituksia. Tämän yksinkertaisen esimerkin pohjalta voidaan kuitenkin kirjoittaa mitä monimutkaisempia etämetodeihin nojaavia ohjelmia lisäämällä luokkiin ominaisuuksia. Laskin.java 4.1. Etäkutsuttavat metodit sisältävä rajapinta. /** * Laskin-rajapinta, joka toimii niin palvelimen, kuin * asiakkaankin rajapintana rmirekisteristä saatavalle * Laskintoiminnot tarjoavalle luokalle. * Laajentaa rajapintaa java.rmi.remote, joka on yleinen * ylirajapinta rajapinnoille, joiden metodeja voidaan * suorittaa ei-paikalliselta virtuaalikoneelta. * Luokan jokaisen metodin tulee heittää java.rmi.remoteexception, * joka on yleinen yliluokka useille etäyhteyteen liittyville * poikkeuksille.

JavaRMI 7 public interface Laskin extends java.rmi.remote { //Yhteenlasku public long summaa(long a, long b) throws java.rmi.remoteexception; //Vähennyslasku public long vähennä(long a, long b) throws java.rmi.remoteexception; //Kertolasku public long kerro(long a, long b) throws java.rmi.remoteexception; //Jakolasku public long jaa(long a, long b) throws java.rmi.remoteexception; LaskinImpl.java 4.2. Tynkärajapinnan toteuttava luokka. /** * LaskinImpl-luokka toteuttaa Laskin-rajapinnan, * eli suorittaa itse laskutoimitukset pyydettäessä. * Laajentaa luokkaa java.rmi.server.unicastremoteobject, * jonka avulla luokka linkittyy javan rmi järjestelmään. public class LaskinImpl extends java.rmi.server.unicastremoteobject implements Laskin { /* * Konstruktori täytyy määritellä java.rmi.remoteexceptionin * heittäväksi, vaatimus jonka UnicastRemoteObject asettaa. public LaskinImpl() throws java.rmi.remoteexception { /* Yliluokan konstruktorin kutsuminen suorittaa * UnicastRemoteObjectin koodin joka hoitaa linkittämisen * rmi järjestelmään, sekä etäolion initialisoinnin. super(); /* Laskutoimitukset suorittavat metodit tulee * määrittää palauttamaan java.rmi.remoteexception, joka * on yleinen yliluokka useille eri etäyhteyteen liittyville * poikkeuksille. //Yhteenlasku public long summaa(long a, long b) throws java.rmi.remoteexception { return a + b; //Vähennyslasku

JavaRMI 8 public long vähennä(long a, long b) throws java.rmi.remoteexception { return a - b; //Kertolasku public long kerro(long a, long b) throws java.rmi.remoteexception { return a * b; //Jakolasku public long jaa(long a, long b) throws java.rmi.remoteexception { return a / b; Ilman perintää LaskinImpl-luokan ei välttämättä tarvitse laajentaa UnicastRemoteObject-luokkaa, vaan luokan rekisteröinnin rmi-järjestelmään voi hoitaa suorittamalla metodin: UnicastRemoteObject.exportObject(this) LaskinPalvelin.java import java.rmi.naming; 4.3. RMI-palvelimen kirjoittaminen. /** * LaskinPalvelin rekisteröi Laskin-rajapinnan toteuttavan * LaskinImpl luokan olion rmirekisteriin nimellä LaskinPalvelu. public class LaskinPalvelin { /* * LaskinPalvelimen konstruktorissa rekiströidään Laskimen toteuttava * rmi-palvelu. public LaskinPalvelin() { try { // Luodaan uusi laskimen toteuttava olio sidottavaksi palveluun. Laskin c = new LaskinImpl(); /* Rekisteröidään Laskin-rajapinnan toteuttava LaskinImpl-luokan * olio samalla koneella ajettavaan rmirekisteriin nimellä * LaskinPalvelu. Jos nimelle on jo rekisteröity palvelu, * se korvataan tällä uudella oliolla. Naming.rebind("rmi://localhost:1099/LaskinPalvelu", c); /* Jos annettu rmirekisterin osoite on epäkelpo url, * Naming.rebind heittää MalformedURLExceptionin. catch (MalformedURLException mue) { System.out.println("MalformedURLException"); System.out.println(mue);

JavaRMI 9 /* Jos rmirekisteriin ei saada yhteyttä, heittää * Naming.rebind RemoteException. catch (RemoteException re) { System.out.println("RemoteException"); System.out.println(re); /* Jos Naming.rebind-metodia kutsutaan ei-paikalliselta isännältä, * se heittää AccessExceptionin. catch (AccessException ae) { System.out.println("AccessException"); System.out.println(ae); /* * main-metodi luo vain uuden LaskinPalvelimen, jonka * konstruktorissa kaikki työ tehdään. public static void main(string args[]) { new LaskinPalvelin(); LaskinAsiakas.java 4.4. RMI-asiakkaan kirjoittaminen. import java.rmi.naming; import java.rmi.remoteexception; import java.net.malformedurlexception; import java.rmi.notboundexception; /** * LaskinAsiakas pyytää rmiregistryltä Laskimen tynkäluokkaa ja * laskee saamallaan luokalla pari triviaalia laskutoimitusta. public class LaskinAsiakas { public static void main(string[] args) { try { /* Pyydetään tynkäluokkaa joka on rekisteröity nimellä * LaskinPalvelu rmirekisteriltä jota ajetaan samalla * koneella kuin asiakasta ja castataan(suomennos?) * se luokan Laskin olioksi. Laskin c = (Laskin)Naming.lookup("rmi://localhost/LaskinPalvelu"); //Triviaalit laskutoimitukset. System.out.println( c.vähennä(4, 3) ); System.out.println( c.summaa(4, 5) ); System.out.println( c.kerro(3, 6) ); System.out.println( c.jaa(9, 3) ); /* Jos annettu RMIrekisterin osoite on epäkelpo url, * Naming.lookup heittää MalformedURLExceptionin. catch (MalformedURLException murle) { System.out.println(); System.out.println("MalformedURLException");

JavaRMI 10 System.out.println(murle); /* Jos rmirekisteriin ei saada yhteyttä, heittää * Naming.lookup RemoteExceptionin. catch (RemoteException re) { System.out.println(); System.out.println("RemoteException"); System.out.println(re); /* Jos rmirekisteriin ei ole rekisteröity nimeä, jota * pyydetään Naming.lookupilla, Naming.lookup heittää * NotBoundExceptionin. catch (NotBoundException nbe) { System.out.println(); System.out.println("NotBoundException"); System.out.println(nbe); /* ArithmeticException tulee kopata Laskimen suorittamien * laskutoimitusten takia eikä liity itse rmin toteutukseen. catch (java.lang.arithmeticexception ae) { System.out.println(); System.out.println("java.lang.ArithmeticException"); System.out.println(ae); 4.5. Esimerkin kääntäminen Aluksi käännetään palvelun rajapinta ja itse palvelun implementaatio; >javac Laskin.java >javac LaskinImpl.java Seuraavaksi generoidaan etäkäyttöön tarvittavat stub- ja skeleton luokat; >rmic LaskinImpl rmic vivut java 2:n rmic:tä ajettaessa voidaan vivuilla valita mille javan versiolle tynkät/luurangot generoidaan. >rmic -v1.1 LaskinImpl # Generoi tyngät ja lurkit java1:lle. >rmic -v1.2 LaskinImpl # Generoi tyngät java2:lle. >rmic -vcompat LaskinImpl # Generoi tyngät ja lurkit molemmille javaversioille. Lopuksi käännetään palvelin- ja asiakasohjelma; >javac LaskinPalvelin.java >javac LaskinAsiakas.java Ja sitä myöten esimerkki on valmis ajettavaksi. 1.Käynnistä rmiregistry 5. Ajaminen

JavaRMI 11 Windows: start rmiregistry Unix: rmiregistry & 2.Käännä lähdekoodi Käännä lähdekoodit seuraavilla komennoilla: javac *tiedosto* 3.Käynnistä serveri Käynnistä serveri luokat sisältävässä hakemistossa kirjoittamalla: java *serveri* Java-versiosta 5.0 lähtien RMI stubseja ei ole enää tarvinnut kääntää erikseen rmic:llä. 4.Käynnistä asiakas Asiakas voidaan ajaa paikallisesti, tai joltain muulta koneelta. Jos ajat asiakkaan paikallisesti käytä seuraavaa komentoa: java *asiakas* localhost Jos taas ajat asiakkaan muualta, niin käytä seuraavaa komentoa (korvaa *hostname* oikealla hostnamella) java *asiakas* *hostname* 6. Yhteenveto Java RMI tarjoaa suhteellisen helposti käytettävät työkalut hajautetun ohjelman toteuttamiseen. Kuten koodiesimerkeistä huomaamme, yksinkertaisen toteutuksen tekeminen ei ole kovinkaan monimutkaista. RMIn käyttöönoton tekee helpoksi myös se, että se sisältyy Javan kehityspakettiin, joten mitään erillisiä lisäosia ei tarvita. Tämä tarkoittaa luonnollisestsi myös sitä, että RMItä voidaan käyttää ainoastaan Javan kanssa. Java RMI on muuttunut melko radikaalisti Javan eri versioiden aikana. Jopa koodin kääntäminen tehdään uudemmissa Java-versioissa eri tavalla. Tämä tekee hyvien ohjeiden etsimisen internetistä hankalaksi, ja vanhoille versioille tehtyjä ohjeita löytyy paljon. Harvassa ohjeessa on minkäänlaista mainintaa, mille versiolle ohje on laadittu. Varmin tapa löytää uusinta tietoa on hakea sitä Sunin sivuilta, josta löytyy varmasti oikeat syntaksit. 7. Erot luennolla esitettyyn materiaaliin Luennolla käsiteltiin Java RMI:n aiempaa versiota (J2SE 5.0), kun tässä olemme käsitelleet Java RMI:n uudempaa versiota (Java SE 6). Uuden version etuna on se, että skeletonit ovat tarpeettomia. Uusi versio käyttää hyväkseen Activable ominaisuutta. Ja näin Java RMI:tä on edelleen pyritty tekemään käyttäjäystävällisemmäksi. 8. Käyttölupa Annamme luvan käyttää tätä ohjetta materiaaliana yliopistolla opetustarkoituksiin ja jatkokehittelyyn.

JavaRMI 12 Lähteet http://java.sun.com/developer/onlinetraining/rmi/rmi.html#intrormi Seppo Pastila, Java RMI, Helsingin Yliopisto Tietojenkäsittelytieteen laitos, Väliohjelmistot http://www.cs.helsinki.fi/u/summanen/opetus/2003/middleware/esseet/pastila.doc http://java.sun.com/docs/books/tutorial/rmi/toc.html Timo Aaltonen, Hajautettujen järjestelmien perusteet, Java RMI http://www.cs.tut.fi/~hajap/luennot/12javarmi.pdf http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp http://java.sun.com/javase/6/docs/platform/rmi/spec/rmitoc.html http://en.wikipedia.org/wiki/java_remote_method_invocation