- 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 izjava.rmi.Remote
(extends Remote
) klase;- svaki metod u okviru ovog interfejsa treba da bude deklarisan tako da moze da baci
java.rmi.RemoteException
(odnosnothrows Remote
); - dobra naming konvencija je stavljanje prefiksa
I
na ime datih interfejsa (npr.IMojaRemoteKlasa
,IStudent
,IAkumulator
, ...);
- svaki metod u okviru ovog interfejsa treba da bude deklarisan tako da moze da baci
- 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
;
- u ovoj klasi mora da postoji konstruktor, makar i praznog tela, koji ce bacati
- 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 najcesce1099
) - 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;
- kreiranje registry servisa vrsi se pomocu komande
- 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;
- u serveru ce zapravo "ziveti" nasi remote objekti (ne racunajuci
- potrebno je prvobitno kreirati njegov interfejs (
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
, interfejsjava.io.Serializable
;
-
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.
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: