45
SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA ZAVRŠNI RAD br. 4465 Android aplikacija za razmjenu poruka temeljena na standardu JMS Antonio Ivčec Zagreb, lipanj 2016.

Android aplikacija za razmjenu poruka temeljena na standardu JMS

Embed Size (px)

Citation preview

Page 1: Android aplikacija za razmjenu poruka temeljena na standardu JMS

SVEUČILIŠTE U ZAGREBU

FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA

ZAVRŠNI RAD br. 4465

Android aplikacija za razmjenu poruka temeljena na standardu JMS

Antonio Ivčec

Zagreb, lipanj 2016.

Page 2: Android aplikacija za razmjenu poruka temeljena na standardu JMS
Page 3: Android aplikacija za razmjenu poruka temeljena na standardu JMS
Page 4: Android aplikacija za razmjenu poruka temeljena na standardu JMS

Sadržaj Uvod ....................................................................................................................................... 11. Standard JMS ................................................................................................................. 2

1.1. JMS ahitektura ....................................................................................................... 31.2. JMS modeli ............................................................................................................ 4

1.2.1. Model komunikacije porukama ..................................................................... 41.2.2. Model objavi-pretplati ................................................................................... 5

1.3. Programski model JMS .......................................................................................... 61.3.1. Administrativni objekti .................................................................................. 71.3.2. JMS veze ........................................................................................................ 71.3.3. JMS sjednice .................................................................................................. 81.3.4. JMS proizvođači ............................................................................................ 81.3.5. JMS potrošači................................................................................................. 81.3.6. JMS poruke .................................................................................................... 91.3.7. JMS iznimke ................................................................................................ 10

1.4. JMS 2.0 ................................................................................................................ 111.4.1. Pojednostavljeni API ................................................................................... 121.4.2. Nove mogućnosti ......................................................................................... 16

2. Apache ActiveMQ ....................................................................................................... 212.1. Grupe poruka ....................................................................................................... 212.2. Virtualna odredišta ............................................................................................... 222.3. Zamjenski znakovi za odredišta ........................................................................... 222.4. Kompozitna odredišta .......................................................................................... 23

3. O web priključnicama .................................................................................................. 243.1. Web priključnica Kaazing .................................................................................... 24

4. O razvijenoj aplikaciji .................................................................................................. 254.1. Tehničke značajke ................................................................................................ 254.2. Programske značajke ........................................................................................... 264.3. Dizajn aplikacije .................................................................................................. 294.4. Testiranje aplikacije ............................................................................................. 324.5. Buduće nadogradnje aplikacije ............................................................................ 33

Zaključak .............................................................................................................................. 34Literatura .............................................................................................................................. 35Sažetak ................................................................................................................................. 36Skraćenice ............................................................................................................................ 38Privitak A ............................................................................................................................. 39Privitak B ............................................................................................................................. 41

Page 5: Android aplikacija za razmjenu poruka temeljena na standardu JMS

1

Uvod

Razmjena porukama danas je neizostavan aspekt ljudskog postojanja.

Kako se ljudska komunikacija razvijala i postajala sve modernijom i boljom, tako

se prirodno javila i potreba za ostvarenjem komunikacije između dijelova softvera

te različitih dijelova jedne aplikacije. Cilj ovog rada bio je proučiti i analizirati

standard JMS upravo takve namjene. JMS je već dugo industrijski standard za

komunikaciju labavo povezanih komponenti, bilo da je riječ o komunikaciji

porukama između dva krajnjih klijenata ili o komunikaciji putem modela objavi-

pretplati. U sklopu ovog rada također je bilo potrebno usporediti postojeće

pružatelje JMS usluge te pronaći jednoga koji omogućava potporu za uređaje koje

pokreće operacijski sustav Android. Korištenjem tog pružatelja JMS usluge trebalo

je izraditi i testirati jednu mobilnu aplikaciju koja demonstrira JMS komunikaciju

pomoću oba modela komunikacije koju on pruža.

U poglavlju 1 dan je pregled standarda JMS 1.1 te pregled kroz poboljšanja

koja je donio novi standard JMS 2.0. U poglavlju 2 opisan je pružatelj JMS usluge

Apache ActiveMQ koji je korišten za izradu aplikacije u ovom radu. U poglavlju 3

opisana je tehnologija web priključnica, te jedna takva priključnica Kaazing koja

omogućuje pokretanje izrađene aplikacije za Android uređaje. U poglavlju 4

opisana je cjelokupna programska potpora koja je ostvarena u sklopu ovog

završnog rada. U privitku su dodane upute za instalaciju i pokretanje ostvarene

programske potpore.

Page 6: Android aplikacija za razmjenu poruka temeljena na standardu JMS

2

1. Standard JMS

Komunikacija porukama koju podrazumijevamo u okviru ovog rada (engl.

messaging) jest komunikacija između softverskih komponenata ili različitih

aplikacija. To je oblik slabo povezane komunikacije (engl. loosely coupled), pri

kojoj pošiljatelj i primatelj razmjenjuju poruke, a da ne moraju u isto vrijeme biti

dostupni. Štoviše, primatelj poruke ne mora znati ništa o pošiljatelju, a pošiljatelj

poruke ništa o primatelju. Pošiljatelj i primatelj samo koriste isto odredište (engl.

destination) poruke koja se prenosi, te koriste isti format poruke. Ovakav oblik

komunikacije se također razlikuje od elektroničke pošte (engl. e-Email), koja

predstavlja komunikaciju između više osoba ili komunikaciju između osobe i

aplikacije.

Standard JMS (engl. Java Message Service) uvodi aplikacijsko programsko

sučelje (engl. Application programming interface, skraćeno API) koje aplikacijama

omogućava stvaranje, slanje, primanje te čitanje poruka. JMS pripisuje sučelja

koja svaki određeni pružatelj JMS usluga implementira na svoj način, držeći se

propisanih ugovora sučelja. JMS omogućuje komunikaciju koja, osim što pruža

slabo povezanu razmjenu podataka, omogućava asinkron i pouzdan prijenos

poruka. Prema tome, klijent može primati poruke bez da ih eksplicitno traži i one

pristižu redom kojim su poslane. Također, svaka poruka koja je pristigla na

odredište uvijek će zainteresiranim klijentima biti isporučena upravo jednom.

Specifikacija JMS objavljena je prvi put u Kolovozu 2008., od strane tvrtke

Sun. Od tada, dobila je svoje nadogradnje 2002. verzijom JMS 1.1, te 2013.

verzijom JMS 2.0.

Page 7: Android aplikacija za razmjenu poruka temeljena na standardu JMS

3

1.1. JMS ahitektura

Arhitektura JMS sustava sastoji se od sljedećih elemenata:

• Davatelj JMS usluge (engl. JMS provider)

- Sustav za komunikaciju koji implementira JMS sučelja te pruža

administrativne i kontrolne značajke koje omogućuju razmjenu poruka.

• JMS klijent (engl. JMS client)

- Programi ili softverske komponente pisane u programskom jeziku Java,

koje proizvode te konzumiraju JMS poruke.

- Primjer: programska potpora izvedena u sklopu ovog rada izgrađena je

koristeći klijentsku JMS biblioteku

• Poruke (engl. JMS messages)

- Objekti koji služe za prijenos informacija između JMS klijenata.

- Postoje različite vrste, ovisno o tipu podataka koji se prenosi. Tako postoje

tekstualne poruke, binarne poruke, poruke tokova podataka te poruke koje

prenose mape vrijednosti (sadrže parove ključ-vrijednost).

• Administrativni objekti (engl. Administrative objects)

- Objekti kreirani i unaprijed konfigurirani od strane administratora, dani na raspolaganje klijentima.

- Uključuju odredišta ( engl. destinations) i tvornice veza (engl. connection factories) te su opisani u nastavku ovog dokumenta.

Page 8: Android aplikacija za razmjenu poruka temeljena na standardu JMS

4

1.2. JMS modeli Postoje dva modela komunikacije koje specificira standard JMS. To su

model komunikacije porukama (engl. point-to-point model, skraćeno PTP) te

model objavi-pretplati (engl. publish-subscribe model). Zadaća svakog davatelja

JMS usluge jest da implementira i omogući ova dva modela komunikacije.

1.2.1. Model komunikacije porukama

Model PTP, baziran je na konceptu redova poruka (engl. message queue),

pošiljatelja i primatelja poruka. Svaka poruka je adresirana na jedan specifični red,

a klijenti izvlače poruke iz reda koji čuva poruke adresirane na njih. Red čuva sve

pristigle poruke dok one nisu konzumirane ili dok poruke ne isteknu. Svaka poruka

može biti konzumirana upravo jednom i od strane upravo jednog klijenta. Sukladno

tome, ako više klijenata čeka poruke od strane istog reda, poruke će biti dostupne

iterativno jednom pa drugom klijentu, redom dospijeća. Pošiljatelj i primatelj

poruke nisu vremenski ovisni te ne moraju biti pokrenuti u isto vrijeme. Tako

primatelj poruke može dohvatiti poruku koja je poslana dok je on bio ugašen (pod

pretpostavkom da poruka u međuvremenu nije istekla).

Sl. 1. 1 Model PTP [1]

Ovakav model komunikacije koristi se kada poslana poruka mora biti

konzumirana od strane upravo jednog klijenta.

Page 9: Android aplikacija za razmjenu poruka temeljena na standardu JMS

5

1.2.2. Model objavi-pretplati

U aplikaciji koja koristi objavi-pretplati model, klijenti se pretplaćuju i

adresiraju određene teme (engl. topics). Time komunikacija funkcionira kao neka

vrsta oglasne ploče. Pretplaćivanjem na temu, klijent prima sve poruke koje su na

tu temu adresirane. Pretplatnici (engl. subscribers) i izdavači (engl. publishers)

djeluju anonimno te se dinamički mogu pretplaćivati na teme. Svaka poruka

adresirana na temu biti će konzumirana od strane svih klijenata koji su pretplaćeni

na tu temu. Poruke ostaju u temi samo onoliko dugo koliko je potrebno da poruka

bude distribuirana svim pretplaćenim klijentima. U ovom modelu, pretplatnici i

izdavači su vremenski ovisni, pošto pretplatnik prima poruke samo nakon što se

registrirao kao pretplatnik, a tema ne sadrži povijest svih poruka koje su na nju

poslane. Isto tako, pretplatnik mora biti aktivan čitavo vrijeme koje želi primati

poruke.

Kako bi se doskočilo gore navedenoj prepreci, postoje takozvane izdržljive

pretplate (engl. durable subscriptions). Naime, takve pretplate omogućuju

arhiviranje poruka za klijenta koji je pretplatnik ali se iz bilo kojeg razloga ugasio.

Takva pretplata se nastavlja sve dok se pretplatnik sam eksplicitno ne odjavi od te

pretplate.

Sl. 1. 2 Model objavi/pretplati [1]

Ovakav model komunikacije koristi se kada poslana poruka može biti

procesirana od strane više klijenata.

Specifikacija JMS 1.1 omogućuje korištenje istog koda za izvođenje

komunikacije preko tema ili preko redova, čime se dobiva na fleksibilnosti i

Page 10: Android aplikacija za razmjenu poruka temeljena na standardu JMS

6

višekratnoj iskoristivosti istog koda. Na programerima je da utvrde koji model više

odgovara potrebama njihove aplikacije te njega koriste. Konzumiranje samih

poruka također je neovisno o odabranom modelu i tu se programerima nudi

asinkroni te sinkroni pristup konzumiranja poruka. Kao sinkroni način čekanja

poruke postoji metoda za eksplicitni dohvat poruke s odredišta pri čemu se

pozivajuća dretva blokira dok poruka ne stigne. Alternativni način, koji se danas

češće koristi je pretplata instance slušatelja poruke (engl. message listener) koji

sadrži akciju koju treba izvesti pri primitku poruke. Na ovaj način nema radnog

čekanja i pristigla poruka će svojim dolaskom izazvati svoju obradu.

1.3. Programski model JMS U ovom poglavlju dan je kratki pregled kroz gradivne elemente koje

specificira JMS te od kojih se sastoji svaka aplikacija koja koristi JMS.

Sl. 1. 3 Programski model JMS [1]

Page 11: Android aplikacija za razmjenu poruka temeljena na standardu JMS

7

1.3.1. Administrativni objekti

Kao administrativne objekte, imamo JMS odredišta (engl. JMS destinations)

i tvornice JMS veza (engl. JMS connection factories). To su elementi JMS-a koji

imaju vrlo različitu tehnološku implementaciju između različitih davatelja JMS

usluga.

1.3.1.1 Tvornice JMS veza

Tvornice JMS veza su objekti koje klijent koristi kako bi stvorio vezu s

određenim pružateljem JMS usluge. Tvornica veze enkapsulira skup

konfiguracijskih parametara koji su definirani od strane administratora. Svaka

tvornica JMS veze je ujedno i implementacija jednog od ponuđenih JMS sučelja te

namjene:

• ConnectionFactory

• QueueConnectionFactory

• TopicConnectionFactory

1.3.1.2 JMS odredišta

JMS odredišta su objekti koji služe kao izvori i ponori JMS poruka. U PTP

modelu, odredišta predstavljaju redove, a u Publish/subscribe modelu su to teme.

Jedna aplikacija može istovremeno koristiti i JMS redove i JMS teme. JMS

odredišta implementacije su sučelja Destination.

1.3.2. JMS veze

JMS veza (engl. JMS connection) predstavlja virtualnu vezu aplikacije s

pružateljem JMS usluge. Jedna veza zapravo predstavlja TCP/IP vezu između

klijenta i programa davatelja usluge. Jednom kada je veza ostvarena, ona se

koristi za stvaranje jedne ili više JMS sjednica. JMS veza se obavezno otvara

pozivom metode start i zatvara pozivom metode stop.

Page 12: Android aplikacija za razmjenu poruka temeljena na standardu JMS

8

1.3.3. JMS sjednice

JMS sjednica (engl. JMS session), predstavlja jednodretveni kontekst čija je

namjena stvaranje i konzumiranje poruka. JMS sjednica služi i za stvaranje

proizvođača te potrošača poruka, JMS odredišta (redova i tema) te samih JMS

poruka. JMS sjednice implementiraju sučelje Session.

1.3.4. JMS proizvođači

JMS proizvođač (engl. JMS producer) je objekt koji je stvoren od strane

sjednice i koristi se za slanje poruka na JMS odredište. On je implementacija

sučelja MessageProducer. Pri stvaranju proizvođača, njemu se može navesti

destinacija za koju stvara poruke ili se može napraviti anonimni proizvođač pa u

trenutku slanja, predati i poruka te destinacija na koju se poruka treba poslati.

1.3.5. JMS potrošači

JMS potrošač (engl. JMS consumer) je objekt stvoren od strane sjednice,

koji služi za registriranje klijenta koji je zainteresiran za primanje poruka koje

pristižu na JMS odredište. JMS potrošač je implementacija sučelja

MessageConsumer. Nakon što je potrošač stvoren i otvoren, on postaje aktivan i

koristi se za dohvat pristiglih poruka. Potrošač se otvara pozivom funkcije start,

a zatvara pozivom funkcije stop.

Pristigle poruke mogu se dohvatiti sinkronim pozivom metode receive koja

blokira pozivajuću dretvu, ili asinkronom načinom. Asinkrona metoda

podrazumijeva izradu objekta koji sluša dolazeće poruke (engl. listener) i izvodi

svoju onMessage metodu za svaku pristiglu poruku. Metoda onMessage prima

poruku kao argument, pretvara je u tip poruke, ovisno o tome kakvu poruku

potrošač očekuje, te ju konzumira.

Page 13: Android aplikacija za razmjenu poruka temeljena na standardu JMS

9

1.3.6. JMS poruke

JMS poruke (engl. JMS messages) su primarni objekti JMS komunikacije

koji su jednostavnog, ali izrazito fleksibilnog formata. JMS poruka sastoji se od

svojeg zaglavlja (engl. header), svojih svojstva (engl. properties) i svojeg tijela

(engl. body), od kojih je samo zaglavlje nužno za svaku poruku.

Zaglavlje poruke sadrži niz unaprijed definiranih polja koja klijenti i

pružatelji JMS usluga koriste za identifikaciju i usmjeravanje poruka. Neka polja su

postavljena od strane pružatelja usluge, a neka od strane klijenata. Svaka poruka

ima svoj jedinstveni identifikator koji je sadržan u polju identifikatora poruke (engl.

JMSMessageID field). Vrijednost polja odredište (engl. JMSDestination field)

prikazuje odredište poruke (temu ili red). Također tu su i polja za prioritet i vrijeme

isteka poruke. Određena polja se mogu postaviti od strane klijenta, a neka se

automatski popunjavaju pozivanjem send i publish metoda.

Također, poruka može sadržavati i polja stvorena od strane klijenata koja

nazivamo svojstvima. Tako se mogu izgraditi birači poruka (engl. message

selectors), kojima klijent može filtrirati poruke na osnovu njihovih svojstva.

JMS standard pripisuje 5 podvrsta tipa Message koji označavaju različit tip

poruke i sadrže različito tijelo poruke. Tipovi JMS poruka navedeni su u tablici 1.1.

Tip poruke Sadržaj tijela poruke

TextMessage Objekt tipa java.lang.String MapMessage Skup ime-vrijednost parova, imena su tipa String, a

vrijednosti primitivni tipovi programskog jezika Java. Poredak parova nije definiran

BytesMessage Sirovi tok bajtova čiji format nije interpretiran StreamMessage Tok primitivnih Javinih tipova, koji se popunjavaju i

čitaju sekvencijski ObjectMessage Objekt koji implementira sučelje Serializable

Tablica 1.1 Tipovi JMS poruka

Page 14: Android aplikacija za razmjenu poruka temeljena na standardu JMS

10

1.3.7. JMS iznimke

JMS specificira posebne JMS iznimke (engl. JMS exceptions) koje pružaju

generički način rukovanja iznimkama nastalim tijekom rada JMS aplikacije.

Korijenska iznimka koja se koristi je JMSException. Ta iznimka sadrži niz

naslijeđenih iznimaka koje bolje opisuju specifičnu situaciju koja je dovela do

iznimke, neke od važnijih su:

• InvalidClientIDException

- Baca se kada klijent pokuša postaviti identifikator klijenta na vrijednost koju

JMS poslužitelj ne podržava.

• InvalidDestinationException

- Javlja se kada JMS odredište nije razumljivo JMS poslužitelju, ili odredište

više nije važeće.

• JMSSecurityException

- Javlja se kada JMS poslužitelj odbije poslano korisničko ime i lozinku

poslanu od strane klijenta.

• MessageFormatException

- Javlja se kada se pokuša iščitati polje poruke koje ona ne sadrži ili kada se

njezin sadržaj pokuša čitati kao sadržaj poruke drugačijeg tipa od njezinog.

• MessageNotReadableException

- Baca se kada klijent pokuša pročitati poruku koja omogućuje samo pisanje.

• MessageNotWriteableException

- Baca se kada klijent pokuša pisati u poruku koja omogućuje samo čitanje.

Page 15: Android aplikacija za razmjenu poruka temeljena na standardu JMS

11

1.4. JMS 2.0 Standard JMS dobio je novu inačicu 2.0, u Svibnju 2013. godine. Nova

verzija održava sve programske elemente koji su postojali i u prijašnjim verzijama

JMS-a, no programski se model proširuje i modernizira kako bi bio u skladu s

promjenama koje su se dogodile s novim verzijama Jave. U skladu s time, sve

aplikacije koju su do sada koristile stari API, mogu ga nastaviti koristiti bez nekih

problema s portabilnosti izvornog koda. Ovo je izrazito važno ako se uzme u obzir

da je JMS jedan od najuspješnijih API-jeva po broju različitih implementacija koje

postoje. Osim usklađenosti sa starom verzijom, korištenje JMS 2.0 API-ja u novim

aplikacijama se bitno pojednostavljuje i smanjuje se broj linija koda koje programer

mora napisati kako bi napravio funkcionalnu aplikaciju koja koristi JMS. JMS

standard verzije 2.0 opisan je u detaljnije potpoglavljima koja slijede.

Sl. 1. 4 Novi programski model JMS 2.0 [3]

Page 16: Android aplikacija za razmjenu poruka temeljena na standardu JMS

12

1.4.1. Pojednostavljeni API

Novi standard, još nazvan i pojednostavljeni API (engl. simplified API),

sadrži sve elemente starog, klasičnog API-ja (engl. classic API) te uvodi nova

sučelja. Tako nije potrebno raditi velike preinake u postojećim aplikacijama i

programerima ostaje na odabir da koriste nova sučelja ili već dobro poznate

elemente klasičnog sučelja. U tom smislu, klasični API nije zastario (engl.

deprecated), već se i dalje može koristiti. U novoj verziji uvedena su 3 sučelja,

koja proširuju funkcionalnost već postojećih. Novo sučelje JMSContext služi kao

spajanje starih sučelja Connection i Session u jedan zajednički objekt.

Zamjena za staro sučelje MessageProducer je sučelje JMSProducer. Ono

omogućava postavljanje parametara poruke korištenjem nizanja metoda (engl.

method chaining) čime se dobiva skraćeni i čitljiviji kod. Sučelje JMSConsumer

pojednostavljuje klasično sučelje MessageConsumer i koristi se na sličan način.

Umjesto bacanja iznimke JMSException, korištenje novog pristupa izaziva

bacanje nove iznimke JMSRuntimeException, izvedene iz iznimke

RuntimeException, koja je neprovjeravana iznimka te ne zahtijeva eksplicitno

rukovanje u kodu.

1.4.1.1 Slanje poruke U kôdu 1.1 prikazan je jedan tipičan primjer korištenja klasičnog API-ja,

prikazano je tijelo jedne metode koja šalje JMS poruku. Kao parametri metode

predani su jedna JMS destinacija red, imena queue, te tijelo same poruke u

tekstovnom obliku, text. Ti detalji nisu prikazani na kodu zbog sažetog prikaza. try { Connection connection = connectionFactory.createConnection(); try { Session session = connection.createSession( false, Session.AUTO_ACKNOWLEDGE);

MessageProducer messageProducer = session.createProducer(queue); TextMessage textMessage = session.createTextMessage(text); messageProducer.send(textMessage); } finally { connection.close(); } } catch (JMSException ex) { // rukovanje iznimkom }

Kôd 1.1 – Slanje poruke korištenjem JMS 1.1

Page 17: Android aplikacija za razmjenu poruka temeljena na standardu JMS

13

Stvara se zasebna instanca veze i instanca sjednice. Zatim se stvara

proizvođač poruke na predanom redu stvorene sjednice. Stvara se jedna

tekstualna poruka i proizvođač šalje poruku. Nakon komunikacije, veza se

eksplicitno zatvara.

try (JMSContext context = connectionFactory.createContext();){

context.createProducer().send(queue, text)

} catch (JMSRuntimeException ex)

// rukovanje iznimkom

}

Kôd 1.2 – Slanje poruke korištenjem JMS 2.0

Kôd 1.2 prikazuje isti scenarij korištenjem novog API-ja. Umjesto da se

stvaraju instance veze i sjednice, stvara se samo JMS kontekst. Nakon toga se na

kontekstu u istoj liniji stvara proizvođač i šalje poruka predanom redu, odnosno

destinaciji. Umjesto eksplicitnog zatvaranja veze, kontekst se definira u posebnoj

verziji konstrukta try s resursima (engl. try with resources), koji je dostupan od

Jave verzije 7. Ovakvo korištenje konteksta je moguće jer klasa JMSContext

implementira sučelje Closeable koje mu omogućava automatsko brisanje pri

izlasku iz try bloka. Sučelja Connection i Session sada se također mogu

definirati na ovaj način. Isto tako, nigdje nije potrebno eksplicitno stvaranje

tekstualne poruke, već ju potrošač stvara implicitno, na osnovu predanog String

objekta text koji predstavlja tijelo poruke. Novi pristup također prikazuje korištenje

novi iznimke JMSRuntimeException.

Page 18: Android aplikacija za razmjenu poruka temeljena na standardu JMS

14

1.4.1.2 Sinkrono primanje poruke Kôd 1.3 prikazuje tijelo metode koja na sinkroni način prima poruku i iz nje

izvlači tekst u varijablu body. String body=null;

try {

Connection connection = connectionFactory.createConnection();

try {

Session session = connection.createSession(

false, Session.AUTO_ACKNOWLEDGE);

MessageConsumer messageConsumer =

session.createConsumer(queue);

connection.start();

TextMessage textMessage =

(TextMessage)messageConsumer.receive();

body = textMessage.getText();

} finally {

connection.close();

}

} catch (JMSException ex) {

// rukovanje iznimkom

}

Kôd 1.3 – Sinkrono primanje poruke korištenjem JMS 1.1

Stvara se instanca veze, sjednice i potrošača. Prima se poruka

odgovarajućeg tipa i iz poruke se vadi tijelo u tekstualnom obliku.

String body=null; try (JMSContext context = connectionFactory.createContext();){ JMSConsumer consumer = session.createConsumer(queue); body = consumer.receiveBody(String.class); } catch (JMSRuntimeException ex) { // rukovanje iznimkom }

Kôd 1.4 – Sinkrono primanje poruke korištenjem JMS 2.0

U kôdu 1.4 radi se ista stvar opet korištenjem klase JMSContext za

spajanje na vezu. Ovdje nema eksplicitnog pretvaranja u tip poruke koja se

očekuje već se pozivom metode receiveBody direktno dobiva tijelo te poruke.

Page 19: Android aplikacija za razmjenu poruka temeljena na standardu JMS

15

Kao parametar, ta metoda očekuje identifikator klase, koji označuje tip tijela

poruke koje se želi izvaditi.

1.4.1.3 Asinkrono primanje poruke

Ako se poruka želi dočekati asinkrono, tu postoji mogućnost dodavanja

slušača nad instancom potrošača poruke, MessageConsumer. Slušač poruke je

opisan sučeljem messageListener. Nakon registracije slušača poruke, vezu je

potrebno eksplicitno pokrenuti pozivom start, kako bi praćenje započelo. Takvo

korištenje prikazano je u kôdu 1.5.

MessageConsumer messageConsumer = session.createConsumer(queue);

messageConsumer.setMessageListener(messageListener);

connection.start();

Kôd 1.5 – Asinkrono primanje poruke korištenjem JMS 1.1

U pojednostavljenom API-ju, asinkrono primanje poruke se odvija na sličan

način. Pojednostavljenje je u tome što pozivanje metode start nad vezom više

nije potrebno, već čekanje poruka započinje sa stvaranjem same veze. Takvo

ponašanje je automatsko, no može se naknadno promijeniti. Kôdu 1.6 prikazuje

asinkrono primanje poruke korištenjem pojednostavljenog API-ja.

JMSConsumer consumer = context.createConsumer(queue);

consumer.setMessageListener(messageListener);

Kôd 1.6 – Asinkrono primanje poruke korištenjem JMS 2.0

Page 20: Android aplikacija za razmjenu poruka temeljena na standardu JMS

16

1.4.2. Nove mogućnosti

1.4.2.1 Dijeljene pretplate

Jedan od najvažnijih noviteta koji je uveden u verziji JMS 2.0 jest uvođenje

takozvanih dijeljenih pretplata (engl. shared subscriptions). Dijeljene pretplate

namijenjene su za klijenta koji posao dohvaćanja novih poruka s teme dijeli na

nekoliko JMS potrošača. U tom smislu, drugi JMS potrošači se pokreću u

odvojenim dretvama ili pak u skroz odvojenim Javinim virtualnim strojevima (engl.

Java virtual machine). Recimo da posao koji potrošač radi nad dobivenom

porukom traje duže nego prosječno vrijeme između dolaska dviju poruka. U tom

slučaju nam nastaje usko grlo jer svaka sljedeća poruka sigurno čeka u redu zbog

procesiranja stare poruke. Ako pak napravimo više potrošača koji rade istu

obradu, oni će svi dobiti sve poruke i krenuti ih procesirati. Ideja je sljedeća:

umjesto da se svaki potrošač spaja na temu i dobiva svoju instancu iste poruke,

potrošači koriste zajedničku, dijeljenu pretplatu i svaka nova poruka šalje se samo

jednom od pretplaćenih potrošača, upravo onom koji ju je spreman obraditi. Do

sada se ovom problemu moglo doskočiti uporabom tehnologije Message-Driven Beam unutar platforme Java EE ili pak nekim rješenjima na razini pružatelja JMS

usluge. Recimo, implementacija pružatelja usluge HornetQ nudila je takozvane

divert objekte koji bi usmjeravali poruke iz JMS teme na JMS red kojeg su slušali

potrošači te bi preko njega ciklički primali pristigle poruke. JMS 2.0 donio je

rješenje ovog problema sa standardiziranjem dijeljene pretplate koja više nije

ekskluzivna samo za Java EE. Klasa JMSContext sadrži statičku metodu

createSharedConsumer koja stvara takvog pretplatnika na predanoj temi.

Dijeljene pretplate dostupne su u običnoj i u izdržljivoj verziji pretplate na temu.

Ukratko, pretplate na temu sada imaju 4 verzije:

• Nedijeljena regularna pretplata (engl. Unshared nondurable subscription)

- dostupna u verziji 1.1 i verziji 2.0

- stvara se pozivom metode createConsumer

- postavljanje identifikatora klijenta pretplate je opcionalno

Page 21: Android aplikacija za razmjenu poruka temeljena na standardu JMS

17

• Nedijeljena izdržljiva pretplata (engl. Unshared durable subscription)

- dostupna u verzijama 1.1 i 2.0

- stvara se pozivom metode createDurableSubscriber ili

createDurableConsumer (samo u verziji 2.0)

- sadrži samo jednog potrošača

- postavljanje identifikatora klijenta je obavezno

- pretplata se identificira kombinacijom imena pretplate i klijentskog

identifikatora

• Dijeljena regularna pretplata (engl. Shared nondurable subscription)

- dostupna od verzije 2.0

- stvara se pozivom metode createSharedConsumer

- može sadržavati više pretplatnika

- za identifikaciju pretplate koristi se ime pretplate i identifikator klijenta koji

može i ne mora biti postavljen

• Dijeljena izdržljiva pretplata (engl. Shared durable subscription)

- dostupna od verzija 2.0

- stvara se pozivom metode createSharedDurableConsumer

- može sadržavati više pretplatnika

- za identifikaciju pretplate koristi se ime pretplate i identifikator klijenta koji

može i ne mora biti postavljen

Page 22: Android aplikacija za razmjenu poruka temeljena na standardu JMS

18

1.4.2.2 Odgoda slanja poruke

JMS 2.0 također uvodi odgodu slanja poruke. Ukoliko se koristi klasični API,

odgoda se može postaviti na instancu sučelja MessageProducer metodom

setDeliveryDelay. Ako se koristi pojednostavljeni API, tada se odgoda

postavlja na instancu tipa JMSProducer. Varijanta metode u novom sučelju vraća

korišteni JMSProducer objekt čime se postiže elegantno nizanje metoda

navedeno u nastavku. Odgoda slanja poruke u obje varijante navodi se u

milisekundama. Postavljanje odgode slanja poruke prikazano je u kodu 1.7.

try(JMSContext context = connectionFactory.createContext()) {

context.createProducer()

.setDeliveryDelay(20000)

.send(queue, “Hello world”);

}

Kôd 1.7 – Postavljanje odgode slanja poruke

1.4.2.3 Svojstvo o dostavi poruke

Unutar JMS 1.1 poruke, već je postojalo svojstvo JMSXDeliveryCount,

koje daje informaciju koliko je puta jedna poruka bila poslana. Međutim, do sada

je postavljanje tog svojstva bilo potpuno opcionalno. Razlog zašto se neka poruka

uzastopno isponova šalje, jest ako je došlo do problema s prijenosom poruke prvi

put. Takav slučaj je obično problem na strani aplikacije, koja nije u stanju

procesirati poruku ili ju obrađuje na krivi način što izaziva iznimku. Verzija 2.0

pokušava riješiti ovaj problem, na način da postavljanje tog svojstva postaje

obavezno. Sada aplikacija koja konzumira poruku može detektirati da je poruka na

neki način “loša” ili uzrokuje probleme, te može na poseban način njome rukovati.

Recimo, poruka koje je nevaljana se može poslati u poseban red za takve poruke

kako bi administrator mogao ispitati uzrok problema.

Page 23: Android aplikacija za razmjenu poruka temeljena na standardu JMS

19

1.4.2.4 Asinkrono slanje poruke

Uobičajeno, kada JMS klijent pošalje poruku, metoda send ne završava

svoj posao dok klijent ne dobije povratnu poruku od servera da je poruka sretno

stigla. Takav način slanja poruka smatramo sinkronim slanjem (engl. synchronous

send). JMS 2.0 uvodi mogućnost slanja poruke na asinkroni način (engl.

asynchronous send). Prilikom slanja poruke, ista se šalje serveru, a kontrola se

automatski vraća aplikaciji bez čekanja na odgovor sa servera. Na taj način,

aplikacija nije osuđena na radno čekanje, već tijekom čekanja na odgovor sa

servera može raditi nešto korisno. Davatelj JMS usluge obavješćuje aplikaciju o

uspješnosti poslane poruke pomoću metode onCompletion unutar instance

slušatelja CompletionListener. Dva su glavna razloga iz kojih bi netko želio

koristiti asinkroni način slanja poruke. Prvi je čisto izbjegavanje radnog čekanja,

asinkrono slanje omogućuje izvođenje nekih drugih operacija, većeg prioriteta za

vrijeme čekanja odgovora. Recimo ažuriranje grafičkog korisničkkog sučelja ili

obrada neke druge poruke. Drugi razlog je da korisnik može doći u situaciju da želi

poslati veliki broj poruka odjednom. Tada čekanje povratnih poruka može dodatno

usporiti rad cijele aplikacije i predstavljati usko grlo za izvođenje ostatka aplikacije.

try (JMSContext context = connectionFactory.createContext();){

CountDownLatch latch = new CountDownLatch(1);

MyCompletionListener myCompletionListener =

new MyCompletionListener(latch);

context.createProducer()

.setAsync(myCompletionListener)

.send(queue,"Hello world");

// u ovom trenu moze se izvesti

// neki korisni posao

latch.await();

if (myCompletionListener.getException()==null){

System.out.println("Stigao odgovor sa servera!");

} else {

throw myCompletionListener.getException();

}

}

Kôd 1.8 – Postavljanje odgode slanja poruke

Page 24: Android aplikacija za razmjenu poruka temeljena na standardu JMS

20

Kôd 1.8 predstavlja jedan takav posao. Prije slanja poruke, proizvođač JMS

poruke dobiva instancu sučelja CompletionListener kroz metodu setAsync.

Za čekanje odgovora ovdje smo koristili instancu klase CountDownLatch (iz

paketa java.util.concurrent) , čija metoda await izaziva čekanje dok neka druga

dretva ne pozove njezinu metodu countDown. U kodu 1.9 u nastavku dan je cijeli

kod klase MyCompletionListener kako bi bili jasniji detalji njezine izvedbe.

class MyCompletionListener implements CompletionListener {

CountDownLatch latch;

Exception exception;

public MyCompletionListener(CountDownLatch latch) {

this.latch=latch;

}

@Override

public void onCompletion(Message message) {

latch.countDown();

}

@Override

public void onException(Message message, Exception exception) {

latch.countDown();

this.exception=exception;

}

public Exception getException(){

return exception;

}

}

Kôd 1.9 – Implementacija sučelja CompletionListener

Sučelje CompletionListener specificira dvije metode. Metodu

onCompletion i onException. U konkretnom primjeru, kada je poruka pristigla,

instanca sučelja CompletionListener dojavljuje instanci CountDownLatch da

može prestati čekati na nju.

Page 25: Android aplikacija za razmjenu poruka temeljena na standardu JMS

21

2. Apache ActiveMQ

Apache ActiveMQ je posrednik poruka otvorenog koda, koji ima potpunu

implementaciju JMS klijenta te potporu za posrednika poruka. On pruža opcije za

velika poduzeća koja omogućuju komunikaciju s više od jednog klijenta i

poslužitelja u isto vrijeme. On podržava veliku količinu višeplatformskih klijenata i

protokola. Isto tako, on uključuje biblioteke u programskim jezicima Java, C, C++,

C#, Ruby, Perl, Python, PHP . Trenutno je najnovija verzija 5.13.3. U nastavku su

navedene neke od brojnih naprednih mogućnosti koje ActiveMQ nudi povrh same

JMS specifikacije, kako bi komunikaciju porukama učinio što boljom i lakšom za

korištenje.

2.1. Grupe poruka

Grupu poruka (engl. Message group) čine sve poruke koje imaju istu

vrijednost polja JMSXGroupID. ActiveMQ se brine za to da sve poruke u istoj

grupi poruka budu poslane upravo jednom JMS potrošaču (vlasniku grupe

poruka), dok god je on aktivan. Čim taj potrošač prestane s radom, drugi potrošač

će biti odabran. Grupa poruka se isto tako, može zatvoriti manualno. Ovakvo

korištenje poruka je poželjno ako se želi balansirati opterećenjem potrošača nekog

odredišta. Ono što možda nije očito na prvi pogled, jest činjenica da će sve poruke

koje dođu do potrošača i vlasnika grupe poruka, doći upravo redoslijedom kojim su

poslane. Dakle, ovaj način garantira poredak procesiranja poruka na istom

potrošaču.

Page 26: Android aplikacija za razmjenu poruka temeljena na standardu JMS

22

2.2. Virtualna odredišta

Virtualna odredišta omogućuju stvaranje logičkih odredišta koja se vrlo lako

mapiraju u jedno ili više fizičkih odredišta. Ideja virtualnih odredišta jest da se

omogući funkcionalnost koju omogućuju izdržljivi potrošači, ali na način da se

izbjegnu neki problemi s balansiranjem opterećenja koje oni uvode. Naime, pri

gašenju jednog izdržljivog proizvođača, ne želimo da njegov posao ovisi o njemu

samom, već želimo da postoji mogućnost da netko nastavi raditi njegov posao.

Recimo da postoji logička tema VirtualTopic.Topic. Potrošač A se na nju

može pretplatiti kao na bilo koju drugu temu. Međutim, potrošači B i C se mogu

spojiti na red ConsumeQueue.VirtualTopic.Topic (gdje je ConsumeQueue

arbitrarno ime reda koje je zajedničko za potrošača A i B) , te preko njega

naizmjence primati poruke iz originalne teme. Na taj način red, odnosno tema, će

biti konzumirana i nakon prestanka rada jednog of potrošača (B ili C). U ovom

primjeru red ConsumeQueue će se automatski stvoriti.

2.3. Zamjenski znakovi za odredišta

Zamjenski znakovi za odredišta (engl. wildcards) koriste se kako bi se

odjednom spojilo na više odredišta. ActiveMQ uvodi posebne znakove ., * i > kako

bi se izbjeglo pisanje imena odredišta dugih imena, te omogućilo spajanje na više

odredišta istog tipa imena odjednom. Recimo da postoje red

imena “PRICE.STOCK.NASQAD.ORCL” i red imena “PRICE.STOCK.NYSE.IBM”,

ime reda PRICE.> odnosilo bi na oba ta reda, pošto oboje počinju prefiksom

“PRICE.”. Znak zvjezdica (*) koristi se za zamjenu bilo kojeg niza znakova u

imenu, a znak točka (.) kao odvajanje dijelova imena.

Page 27: Android aplikacija za razmjenu poruka temeljena na standardu JMS

23

2.4. Kompozitna odredišta

Od verzije 1.1 ApacheMQ podržava kompozitna odredišta (engl. composite

destinations). Kompozitna odredišta predstavljaju odredišta koja, uz korištenje

oblikovnog obrasca kompozicije, zapravo predstavljaju skupinu JMS odredišta. Na

taj način, operacije nad jednim, vršnim odredištem, rezultiraju delegiranjem tih istih

operacija na sva odredišta koja su sadržana u tom jednom odredištu. Prikaz

takvog korištenja prikazan je u kôdu 2.1. U prvom primjeru red1 je kompozitno

odretište koje sadrži tri redova: prvi, drugi i treci. U drugom primjeru

prikazano je koristenje varijable red2 kao odredišta koje sadrži jednu temu i jedan

red. Ta varijabla koristi se kao delegat za red prvi, te temu jednaTema.

Queue red1 = new ActiveMQQueue(“prvi,drugi,treci");

Producer.send(red1, message);

Queue red2 = new ActiveMQQueue("prvi,topic://jednaTema)

Producer.send(red2, message);

Kôd 2.1 – Postavljanje odgode slanja poruke

Page 28: Android aplikacija za razmjenu poruka temeljena na standardu JMS

24

3. O web priključnicama

Web priključnice (engl. WebSocket) označavaju protokol koji omogućuje

dvosmjerne kanale komunikacije preko jedne TCP veze. Protokol WebSocket

standardiziran je od strane IETF 2011. godine, a API koji on koristi od strane W3C.

Tehnologija WebSocket omogućava stvaranje interaktivne sjednice između klijenta

i poslužitelja. Koristeći njegov API, omogućeno je slanje poruka na poslužitelj te

primanje poruka pokrenutih događajima (engl. event-driven messaging), bez

prozivanja servera i eksplicitnog čekanja na odgovor.

Specifikacija protokola WebSocket uvodi kratice ws i wss kao dio URI sheme,

koje označavaju nekriptiranu i kriptiranu vezu priključnicom. Protokol WebSocket

podržan je u većini modernih web preglednika, uključujući Google Chrome,

Internet Explorer, Firefox, Safari te preglednik Opera.

3.1. Web priključnica Kaazing Jedna takva implementacija standarda WebSocket je i web priključnica

Kaazing. Kaazing rukuje svom komunikacijom preko web priključnice, pretvarajući

poruke iz poslužiteljskih servisa baziranih u različitim tehnologijama (RSS, XMPP,

JMS) u WebSocket događaje. Kaazing podržava više različitih klijenata, među

kojima su web klijenti HTML5 (uključivši i mobilne uređaje) najistaknutiji.

Web priključnica Kaazing ima svoju JMS inačicu koja proširuje mogućnosti

ostalih davatelja JMS usluge. Tako Kaazing omogućuje distribuciju JMS poruka

preko velikog broja JMS klijenata, puno većeg nego što bi to normalan posrednik

JMS poruka uspio sam. Također, on omogućava JMS komunikaciju klijenata preko

web-a, vatrozida i preko posredničkih poslužitelja (engl. proxy server). Isto tako,

Kaazing omogućava korištenje istog posrednika poruka klijentima na različitim

platformama. Upravo iz tog razloga je on i korišten u sklopu ovo završnog rada,

kako bi omogućio JMS komunikaciju preko Android uređaja. Da bi omogućio

izradu klijentskih aplikacija preko JMS standarda, Kaazing sadrži posebne

klijentske JMS biblioteke te namjene.

Page 29: Android aplikacija za razmjenu poruka temeljena na standardu JMS

25

4. O razvijenoj aplikaciji

U praktičnom dijelu ovog rada je razvijena aplikacija koja koristi standard JMS

za komunikaciju porukama, izrađena za mobilne uređaje koji koriste operacijski

sustav Android. Aplikacija omogućuje čavrljanje (engl. chat) na dva načina, čime

je prikazano korištenje oba JMS modela. Prvi način omogućuje komunikaciju

modelom razmjene poruka (P2P) u kojoj korisnik stvara izvorni red na kojem čeka

pristigle poruke te se spaja na odredišni red na koji šalje poruke. Preduvjet za

ispravno funkcioniranje ovog modela je pretpostavka da krajnji korisnici znaju

jedan za drugoga, te unaprijed dogovore ime izvorišnog i odredišnog reda koji se

koriste. Drugi način predstavlja model objavi-pretplati, u kojem se klijenti spajaju

na zajedničku temu te anonimno razmjenjuju poruke.

4.1. Tehničke značajke Aplikacija je izvedena korištenjem, sada već standardiziranog okruženja za

izradu Android aplikacija, Android Studija verzije 2.1.1. Kao sustav za

automatizaciju izgradnje aplikacije, Android Studio koristi sustav Gradle (najnovija

verzija 2.13). Sustav Gradle jako olakšava izgradnju same aplikacije jer

omogućuje pokretanje i testiranje aplikacije, izgradnju .apk datoteke koja služi za

pokretanje aplikacije na uređajima te razrješava ovisnosti o bibliotekama koje se

koriste u kodu (engl. dependencies). Za minimalni Android API (engl. minimum

required SDK) odabran je API verzije 14 (Android 4.0 - IceCreamSandwich) kako

bi se omogućilo izvođenje aplikacije na što većem broju Android uređaja. Svi

uređaji s nižom verzijom API-je ne mogu instalirati ovu aplikaciju. Ciljana verzija

Android API-ja (engl. target SDK), koja je i korištena za testiranje aplikacije je

Android SDK verzije 23. Također, korištene su dodatne biblioteke

com.android.support:appcompat-v7 te com.android.support:design, kako bi se

omogućilo korištenje alatne trake (engl. ActionBar) te letećeg teksta (engl. floating

text) koje aplikaciji daju suvremeni izgled.

Page 30: Android aplikacija za razmjenu poruka temeljena na standardu JMS

26

Za omogućavanje JMS komunikacije korištena je web priključnica Kaazing,

te posrednik JMS poruka Apache ActiveMQ. Apache ActiveMQ je također korišten

kao davatelj JMS usluge, a na klijentskoj strani su korištene biblioteke Geronimo

koje sadržavaju implementaciju sučelja JMS, potrebnih za izradu klijentskih

aplikacija. Također su korištene biblioteke koje nudi priključnica Kaazing, za

spajanje klijenata na samu web priključnicu.

4.2. Programske značajke

Aplikacija se sastoji od dva prozora (engl. Activity), Prvi je

MainMenuActivity koji prikazuje inicijalni prozor sa spajanjem na web priključak i

odabirom modela komunikacije, a drugi je prozor ChatActivity koji prikazuje same

poruke. Prozor MainMenuActivity sastoji se od svojeg Java koda u datoteci

MainMenuActivity.java i dokumenta koji opisuje grafičko korisničko sučelje,

activity_menu.xml. Samo korisničko sučelje izvedeno je uporabom menadžera

LinearLayout, koji vizualne elemente pozicionira vertikalno jednog ispod drugoga.

Imena svih grafičkih elemenata, poput gumba, inicijalnih teksta u poljima te

pomoćnih tekstova u ulaznim poljima nalaze se u datoteci values/strings.xml.

Takve informacije su odvojene od koda tako da se lako izmjenjuju izvana, bez

potrebe za ponovnim kompiliranjem cijele aplikacije. Isto tako, pošto informacije o

tekstovima grafičkih elemenata, nisu ugrađene u kod (engl. hardcoded text), vrlo je

lako dodavanje prijevoda istih tekstova na drugim jezicima i na taj način lokalizirati

cijelu aplikaciju. Posao spajanja na JMS vezu, nalazi se u klasi MainMenuActivity,

a posao spajanja na pretplatu, slanja i primanja poruka nalazi se u klasi

ChatActivity. Za prozor ChatActivity kao dokument sa kodom se koristi

ChatActivity.java, a njegovo grafičko sučelje opisano je u dokumentu

activity_chat.xml. Za iscrtavanje samih poruka korišteni su posebni .xml

documenti, pošto su poruke elementi koji se dinamički popunjavaju u prikazu

ListView prozora. Poslana i primljena poruka opisani su dokumentima

received_message.xml i sent_message.xml.

Page 31: Android aplikacija za razmjenu poruka temeljena na standardu JMS

27

Sl. 1. 5 Isječak iz datoteke activity_menu.xml koji opisuje grafičko sučelje inicijalnog

prozora

Logika same aplikacije podijeljena je između klasa MainMenuActivity i

ChatActivity. MainMenuActivity sadrži samo funkcionalnosti za spajanje na vezu,

a ChatActivity sadrži funkcionalnosti registracije i prestanka registracije na

pretplatu te posao s dohvatom i slanjem poruka. Cijeli ChatActivity je ponovno

iskorišten, kako bi isti prozor omogućio komunikaciju putem teme i komunikaciju

putem reda.

Informaciju o tome kako cijeli ChatActivity mora izgledati prenosi MainMenuActivity

pri stvaranju instance klase ChatActivity. Naime, prenosi se jedna instance

novostvorene enumeracije ChatType, koja može biti POINT_TO_POINT ili

PUB_SUB. Kako bi ChatActivity znao razlikovati sučelje poruka koje su pristigle, od

poruka koje je korisnik poslao, koristi se još jedna doatna enumeracija

ChatMessageType. Elementi te enumeracije su SENT i RECEIVED.

Page 32: Android aplikacija za razmjenu poruka temeljena na standardu JMS

28

Sl. 1. 6 Dokument message_outline_sent.xml koji opisuje izgled pojedine dolazne poruke

Kako poslovi koji imaju veze sa JMS vezom (spajanje na vezu,

pretplaćivanje, slanje poruka) ne bi zadržali glavnu dretvu, svi su pokretani

postavljanjem u red dodatnih dretvi klase DispatchThread. Ta klasa podtip je

klase HandlerThread iz paketa android.os. Za dinamičko popunjavanje liste koja

prikazuje pristigle i poslane poruke, korišten je podtip klase ArrayAdapter iz

paketa android.widget, koji nudi funkcionalnost dinamičkog izvora podataka za

listu na grafičkom sučelju.

Page 33: Android aplikacija za razmjenu poruka temeljena na standardu JMS

29

4.3. Dizajn aplikacije Inicijalni prozor aplikacije sastoji se od polja u koji se upisuje lokacija web

priključnice, te tipke CONNECT putem koje se pokreće spajanje na priključnicu.

Prilikom uspješnog spajanja, omogućavaju se tipke POINT TO POINT koja vodi

na čavrljanje između dviju osoba (P2P) te tipke PUBLISH-SUBSCRIBE koja vodi

na grupno čavrljanje putem teme i modela objavi-pretplati. U svakom trenu,

korisnik može zaustaviti vezu sa web priključnicom, a ako ju eksplicitno ne zatraži i

ugasi aplikaciju, veza će se raskinuti sama. Inicijalni prozor prikazan je na slici 1.7.

Sl. 1. 7 Inicijalni prozor aplikacije (lijevo – prije spajanja na web priključak, desno – nakon

spajanja na web priključak)

Page 34: Android aplikacija za razmjenu poruka temeljena na standardu JMS

30

Ako korisnik odluči čavrljati pritiskom na tipku POINT-TO-POINT, dočekat

će ga dijalog sa slike 1.8 (lijevo). U dijalogu, traži se ime reda koji se koristi za

primanje poruke (source queue), te ime reda koji se koristi za slanje poruke

(destination queue). Imena redova unutar JMS-a inače započinju prefiksom

/queue/, no ova aplikacija to sama nadodaje na odabrano ime, tako da se

redovima mogu pridijeliti simbolička imena, koja ovdje imaju interpretaciju

korisničkih imena. Ako zadani red već postoji, isti se koristi za komunikaciju, u

suprotnom se red zadanog imena stvara. Za takvo ponašanje zaslužan je korišteni

posrednik poruka Active ApacheMQ. Prikaz samog prozora za čavrljanje i jednog

toka razgovora dan je na slici 1.8 (desno). Korisnik u svakom trenu može izaći iz

razgovora pritiskom na tipku BACK, mobilnog uređaja.

Sl. 1. 8 Lijevo – upisivanje imena redova za spajanje na čavrljanje korištenjem P2P

modela, desno – P2P čavrljanje u tijeku

Page 35: Android aplikacija za razmjenu poruka temeljena na standardu JMS

31

Pri izlazu iz prozora za čavrljanje, prekidaju se sve aktivne pretplate i

ponovno se ulazi u inicijalni prozor, koji omogućava uspostavljanje novog

razgovora.

Ukoliko se korisnik odluči za komunikaciju preko spajanja na temu, pritišće

tipku PUBLISH-SUBSCRIBE i dočekan je sa dijalogom na slici 1.9 (lijevo). U

dijalogu korisnik navodi ime teme na koju se želi spojiti. Ukoliko ta tema ne postoji,

davatelj JMS usluge Apache ActiveMQ će se pobrinuti za to da takva tema

nastane. Nakon upisivanja imena teme, korisnik dolazi na prozor za komunikaciju

prikazan na slici 1.9 (desno).

Sl. 1. 9 Lijevo – primjer spajanja na temu pod imenom fer-grupa,

desno – tijek izvođenja čavrljanja modelom objavi-pretplati

Page 36: Android aplikacija za razmjenu poruka temeljena na standardu JMS

32

Na prozoru se pojavljuju poruke redom dolaska na temu. Pošto je korisnik

pretplaćen na sve poruke teme, a ujedno i sam šalje poruke na istu temu, njegove

iste poslane poruke mu dolaze kao odgovor od teme. U tome se vidi da je

komunikacija putem teme zapravo anonimna, pošto nijedan član pretplate na temu

ne zna tko su ostali članovi, te ne zna tko je poslao određenu poruku. Kao i u

prošlom modelu komunikacije, korisnik u svakom trenu može izaći iz razgovora

pritiskom na tipku BACK, čime prestaje njegova pretplata na temu.

4.4. Testiranje aplikacije Testiranje aplikacije izvedeno je na sljedećim uređajima:

• Samsung Galaxy S3 mini (Android 4.4.2)

• Samsung Galaxy S5 (Android 4.4.4)

• ZTE Blade L3 (Android 4.4.4)

Testiranje komunikacije preko Kaazing web priključnice ostvareno je

pomoću priključnice koju sam pokrenuo na svojem osobnom računalu na portu

8001. Također, Apache ActiveMQ poslužitelj pokretan je na istom računalu na

portu 8161. Uz testiranje konkretnim Anroid uređajima, tijekom razvoja aplikacije

korišten je Android emulator Genymotion za testiranje funkcionalnosti aplikacije, te

demo web aplikacija koja dolazi uz Kaazing i omogućuje čavrljanje preko

priključnice. Sve uočene pogreške su uklonjene kako bi aplikacija bila što

funkcionalnija i responzivnija.

Page 37: Android aplikacija za razmjenu poruka temeljena na standardu JMS

33

4.5. Buduće nadogradnje aplikacije

Moguće dodatne nadogradnje aplikacije mogle bi uključivati pretraživanje

postojećih redova i tema na spojenoj web priključnici što bi olakšalo korištenje

aplikacije. Tako korisnik ne bi trebao eksplicitno pisati ime teme na koju se želi

pretplatiti već bi ju mogao odabrati iz liste već postojećih tema.

Komunikacija modelom objavi-pretplati mogla bi se dodatno proširiti na

način da se omogući da klijent istovremeno sluša više tema, te da odabire na koju

temu želi poslati poruku. Ovakva komunikacija, iako naizgled malo kaotična,

mogla bi funkcionirati ako bi se, uz pristiglu poruku na neki način ispisalo iz koje

teme poruka dolazi.

Također, moguće je napraviti klijentsko filtriranje poruka, na način da se

prikazuju samo poruke određenog tipa, koje interesiraju korisnika. To se može

postići korištenjem dodatnih polja koje klasa Message nudi i koje bi držale

informaciju o tipu ili sadržaju poruke.

Uz sve navedeno, ovu aplikaciju se može vrlo lako lokalizirati na više

jezika, tako da se dodaju dokumenti sa prijevodima svih grafičkih elemenata.

Page 38: Android aplikacija za razmjenu poruka temeljena na standardu JMS

34

Zaključak

Zadatak ovog završnog rada bio je proučiti standard JMS te putem jednog

pružatelja JMS usluge ostvariti mobilnu aplikaciju koja omogućuje razmjenu

poruka stvarnom vremenu. Kratki pregled kroz JMS standard je dan u ovom radu,

a tražena programska podrška je uspješno realizirana. Izrađena aplikacija

upogonjuje koristi klijentski JMS API kako bi omogućila komunikaciju modelom

P2P te modelom objavi-pretplati. Iako izrađena aplikacija služi više kao demo,

stvarna softverska rješenja koriste JMS na isti način.

Rad na izradi ove aplikacije se na trenutke činio zahtjevan, pošto ne postoji

puno poslužitelja JMS usluge za uređaje na operacijskom sustavu Android, a oni

koji i postoje su uglavnom slabo dokumentirani te nisu popraćeni sa mnogo

konkretnih primjera. Unatoč tome, informacije ipak postoje za one koji ih dovoljno

dugo traže, a i samim programiranjem i testiranjem se jako puno toga nauči i svi

problemi se daju riješiti.

Ostvarena aplikacija bi mogla biti i nadograđena nekim dodatnim

mogućnostima koje bi učinile komunikaciju jednostavnijom te lokalizacijom čime bi

aplikacija bila dostupnija široj publici.

Page 39: Android aplikacija za razmjenu poruka temeljena na standardu JMS

35

Literatura

[1] Oracle (2010), “Overview of the JMS API”,

https://docs.oracle.com/cd/E19798-01/821-1841/bncdr/index.html

[2] Nigel Deakin (2013), “What's new in JMS 2.0”,

http://www.oracle.com/technetwork/articles/java/jms20-1947669.html

[3] Oracle, “Understanding the simplified API programming model”,

https://docs.oracle.com/middleware/1221/wls/JMSPG/simplified_api.htm

[4] Apache ActiveMQ, features, http://activemq.apache.org/features.html

[5] Kaazing WebSocket Gateway, documentation, http://kaazing.com/doc/

[6] Wikipedia, “Websocket“, http://en.wikipedia.org/wiki/WebSocket

Page 40: Android aplikacija za razmjenu poruka temeljena na standardu JMS

36

Sažetak

Android aplikacija za razmjenu poruka temeljena na standardu JMS

Standard JMS (engl. Java Message Service) je industrijski standard za

komunikaciju labavo povezanih softverskih komponenti koji pruža komunikaciju

preko dva modela. To su model komunikacije porukama između krajnjih klijenata

te model objavi-pretplati. API propisan od JMS-a omogućuje aplikacijama

stvaranje, slanje, primanje te čitanje JMS poruka. JMS verzije 2.0 pristigle 2013.,

zadržava sve funkcionalnosti i sučelja koja JMS originalno propisuje, no uvodi i

neke novitete koji olakšavaju i poboljšavaju postojeću JMS uslugu. Tako je novi

API puno sažetiji i jednostavniji za korištenje i usklađen sa novitetima koji su

pristigli u programski jezik Java.

U sklopu izrade ovog rada korišten je posrednik JMS poruka Apache

ActiveMQ, te web priključnica Kaazing kako bi se komunikacija mogla odviti

između više Android uređaja. Izrađena je jednostavna aplikacija za čavrljanje koja

omogućuje dva načina čavrljanja, čime su prikazane funkcionalnosti oba JMS

modela.

Ključne riječi: JMS, model komunikacije porukama, model objavi-pretplati,

Apache ActiveMQ, Kaazing, web priključnica, Android, komunikacija porukama

Page 41: Android aplikacija za razmjenu poruka temeljena na standardu JMS

37

Sumary

An Android Application for Message Exchange

Based on JMS

JMS is the industry standard for loosely-coupled communication of software

components. The JMS API supports two models of communication: point-to-point

model and publish-subscribe model. JMS introduced its API that allows client

application to create, receive, send and read JMS messages. JMS 2.0 came out in

2013. and brought some novelties that simplify and enrich the already existing

JMS service. The new API is more concise, easier to use, and in compliance with

the novelties that came with recent Java versions.

Developed application uses Apache ActiveMQ as the message broker, and

Kaazing WebSocket Gateway, which enables communication between several

Android devices. The finished product is a simple Android chat application, which

showcases communication over point-to-point and publish-subscribe model.

Keywords: JMS, point-to-point model, publish-subscribe model, Apache

ActiveMQ, Kaazing, WebSocket, Android, chat

Page 42: Android aplikacija za razmjenu poruka temeljena na standardu JMS

38

Skraćenice

JMS Java Message Service standard za labavo povezanu komunikaciju softverskih komponenti API Application Programming interface aplikacijsko programsko sučelje IETF Interner Engineering Task Force tvrtka koja razvija i promiče Internet standarde IP Internet Protocol Internetski protokol TCP Transmission Control Protocol transmisijski kontrolni protokol XML Extensible Markup Language proširivi jezik za označavanje RSS Rich Site Summary format za jednostavnu i brzu distribuciju web sadržaja XMPP Extensible Messaging and Presence proširivi protokol za trenutno Protocol poručivanje i evidenciju prisutnosti

Page 43: Android aplikacija za razmjenu poruka temeljena na standardu JMS

39

Privitak A

Instalacija web priključnice Kaazing i posrednika poruka Apache ActiveMQ U ovom privitku opisano je postavljanje web priključnice Kaazing na svoje

lokalno računalo. Dane su upute za pokretanje alata preko bash ljuske, no

pokretanje preko Windowsa i komandne linije su vrlo slične.

Za Windows računala potrebno je preuzeti .zip datoteku sa

http://kaazing.com/download/#ce-kwg, a za Linux ili Mac preuzeti .tar.gz datoteku.

Nakon toga, preuzetu datoteku potrebno je odpakirati u neki mapu, koji ćemo

odsada zvati GATEWAY_HOME. Unutar mape GATEWAY_HOME/brokers nalazi

se mapa apache-activemq-5.10.0 koja sadrži implementaciju posrednika poruka

Apache ActiveMQ. Tu mapu treba kopirati i staviti je negdje gdje se može lako

dohvatiti.

Prije pokretanja i korištenja Android aplikacije, potrebno je pokrenuti

ActiveMQ i Kaazing. Da bi pokrenuli ActiveMQ posrednika poruka preko bash

ljuske, potrebno se pozicionirati u datoteku apache-activemq-5.10./bin te upisati:

./activemq start. Ukoliko je sve u redu, posrednik poruka počinje sa svojim radom i

može mu se pristupiti preko adrese http://localhost:8161/., gdje se nalaze

informacije o trenutno pokrenutim redovima poruka i temama.

Kako bi pokrenuli Kaazing web priključnicu, potrebno je otvoriti

GATEWAY_HOME/conf/gateway-config.xml te pronaći dio:

<service> <name>JMS Service</name> <description>JMS Service</description> <accept>ws://${gateway.hostname}:${gateway.extras.port}/jms</accept> <accept>ws://local-ip-address:${gateway.extras.port}/jms</accept>

Page 44: Android aplikacija za razmjenu poruka temeljena na standardu JMS

40

Na mjestu ”local-ip-address” potrebno je staviti javnu IP adresu računala na koje

se postavlja WebSocktet. Nakon toga, može se pokrenuti Kaazing WebSocket

pozicioniranjem u GATEWAY_HOME/bin te pokretanjem naredbe ./gateway.start

kojom se pokreće WebSocket u trenutnoj bash ljusci.

Ako je sve u redu, Kaazing WebSocket je pokrenut i može mu se pristupiti putem

adrese http://localhost:8001/. Na ovoj adresi nalaze se detalji trenutne veze te

postoji nekoliko demo programa koji opisuju funkcionalnost Kaazing web

priključnice.

U ovom trenu moguće je pokrenuti Android aplikaciju. U trenutku kada se želi

ugasiti JMS komunkacija potrebno je ugasiti pokrenutu Kaazing aplikaciju( ctrl + c)

te ugasiti posrednika poruka ActiveMQ pozicioniranjem u apache-activemq-5.10./bin te pokretanjem naredbe ./activemq stop.

Page 45: Android aplikacija za razmjenu poruka temeljena na standardu JMS

41

Privitak B

Instalacija Android aplikacije Kako bi se uspješno instalirala Android aplikacija potrebno je pratiti sljedeće

korake:

1. U glavnom izborniku uređaja treba odabrati stavku opcije->sigurnost

(engl. settings -> security) te omogućiti instaliranje aplikacije sa

nepoznatih izvora(engl. unknown sources).

2. Potrebno je priključiti uređaj USB kablom na računalo i uključiti USB

skladištenje (engl. USB storage) za kopiranje dadoteka sa računala

na SD karticu uređaja.

3. Unutar Android Studio projekta treba pronaći datoteku

app/build/outputs/apk/app-debug.apk te ju kopirati u proizvoljni

direktorij na uređaju.

4. Sigurno odspojiti Android uređaj sa računala.

5. Pronaći .apk datoteku na mobilnomu uređaju te ju instalirati.

Pod uvjetom da su pokrenuti Kaazing WebSocket i Apache ActiveMQ,

aplikacija se sada može pokrenuti. Prije spajanja na JMS vezu, potrebno je još u

polje Location upisati javnu IP adresu računala na kojem se nalazi WebSocket,

tako da lokacija primjerice izgleda ovako: ws://192.168.5.14:8001/jms.

Ako je sve do sada urađeno ispravno, omogućena je komunikacija između

klijenata na vezi.