Skip to content
This repository has been archived by the owner on Aug 16, 2024. It is now read-only.

Latest commit

 

History

History
46 lines (33 loc) · 4.21 KB

README.md

File metadata and controls

46 lines (33 loc) · 4.21 KB

Java RMI

Sta je najbitnije

  • Za implementaciju svakog remote objekta, odnosno kreiranje tipa/klase remote objekata potrebno je znati par stvari:
    • potrebno je prvobitno kreirati njegov interfejs (interface), koji ce biti izveden iz java.rmi.Remote (extends Remote) klase;
      • svaki metod u okviru ovog interfejsa treba da bude deklarisan tako da moze da baci java.rmi.RemoteException (odnosno throws Remote);
      • dobra naming konvencija je stavljanje prefiksa I na ime datih interfejsa (npr. IMojaRemoteKlasa, IStudent, IAkumulator, ...);
    • zatim, potrebno je kreirati konkretnu klasu koja ce biti izvedena iz java.rmi.server.UnicastRemoteObject i istovremeno implementirati prethodno kreirani interfejs, tj. extends java.rmi.server.UnicastRemoteObject implements <ime_interfejsa>;
      • u ovoj klasi mora da postoji konstruktor, makar i praznog tela, koji ce bacati java.rmi.RemoteException;
    • ovaj postupak se ponavlja za sve domenske klase;
    • nakon implementacije kompletne domenske logike problema, treba napisati server i klijent - klase koje ce sadrzati main metodu i koje sluze kao entrypoint u nasu aplikaciju;
      • u serveru ce zapravo "ziveti" nasi remote objekti (ne racunajuci Serializable objekte, oni se zapravo salju kroz mrezu), koji ce biti mapirani u okviru RMI registry servisa (ovo je samo jos jedan servis koji omogucava ispravno funkcionisanje RMI middleware-a);
        • kreiranje registry servisa vrsi se pomocu komande java.rmi.registry.LocateRegistry.createRegistry(<broj_porta>) (<broj_porta> je najcesce 1099) - vrsice mapiranje URI-ja (preko rmi protokola) na nase remote objekte, preko koga mozemo da im pristupimo kroz mrezu;
        • zapravo mapiranje objekta u registry-ju vrsi se pomocu komande java.rmi.Naming.rebind("rmi://localhost:1099/<ime_objekta>", objekat);;
        • server ce dakle samo sluziti da na njemu "zive" nasi remote objekti i njihovo mapiranje na konkretne URI-eve pomocu registry servisa;
      • klijentska strana bice logicki kompleksnija (zavisno od domenskog problema), a jedini bitan poziv vezan za RMI bice java.rmi.Naming.lookup("rmi://localhost:1099/<ime_objekta>") - pribavljanje reference na remote objekat, preko koje mozemo pristupati njegovim metodama (ovo je upravo ono sto nazivamo RMI - Remote Method Invocation), i pribavljati reference, koje se nalaze u njemu, na druge remote objekte;

Napomena - ukoliko u okviru nasih remote objekata imamo neke DTO objekte, tj. objekte koji sadrze vrednosti podataka od kojih su sacinjeni, a ne reference na njih (to ce uglavnom biti klase koje se sastoje samo od built-in atributa), mozemo implementirati, umesto interfejsa java.rmi.Remote, interfejs java.io.Serializable;


Primeri

Prosti aukcioni sistem

  • Kupac (klijent) moze da izlista sve proizvode za koje je moguce dati ponudu.

  • Kupac moze da se prijavi da ucestvuje na aukciji za neki proizvod, odnosno ovo mora da uradi ukoliko zeli da licitira za njega.

  • Kupac moze da izvrsi licitaciju ukoliko je prijavljen - u ovom trenutku se svim kupcima koji su se prijavili za licitiranje za dati proizvod salje poruka o novoj ceni.

  • Za svaki proizvod se moze izvrsiti N licitacija. Nakon toga, proizvod se prodaje kupcu koji je ponudio najvise. Samo ovaj kupac se obavestava o tome, kao i ceni za koju je kupio proizvod.

  • Kod se moze pronaci ovde.

  • Izgled konzole pri izvrsenju: slika

4. Zadatak sa lab vezbi - Prijava ispita

Obrada izuzetaka nije bas najbolja u prethodnom primeru i kod je generalno pisan ad-hoc. Zbog toga ostavljam i jedan primer sa lab vezbi sa nadogradnjom callback-a. Nadogradnja ce biti sledeca: svaki klijent moze pratiti, odnosno prekinuti pracenje prijava jednog ili vise studenata. Ukoliko klijent prati studenta X i za njega bude dodata prijava, klijent ce dobiti vest o tome.

  • Kod se moze pronaci ovde.
  • Izgled konzole pri izvrsenju: slika

Povratak na pocetnu stranicu