JMS

**Java Message Service** (**JMS**) - standartizuota Java API sąsaja, skirta komunikacijai pranešimais realizuoti tarp dviejų ar daugiau programų sistemų ar jos dalių. JMS API leidžia programų sistemoms sukurti, išsiųsti, priimti ir perskaityti informaciją pranešimų pavidalu. JMS specifikacija (JSR-914) yra Java Platform, Enterprise Edition dalis.

## Komunikacijos pranešimais (''Messaging'') principai
Kaip ir kiekvienoje komunikacijoje, komunikacijoje pranešimais, dalyvauja dvi ar daugiau programų sistemos ar jų dalys vadinamos klientinėmis programomis. Komunikacija pranešimais (*messaging*) - tai silpnai surišanti klientines programas, paskirstyta (angl. distributed), asinchroninė komunikacija. Čia žodis komunikacija yra suprantamas kaip apsikeitimas pranešimais. Sąsaja tarp klientų yra susilpninama specialia tarpine programų sistema, kuri dažnai vadinama pranešimų eile.

Jei klientinė programa siuntėjas nori perduoti pranešimą klientinei programai gavėjui, tai siuntėjas pranešimą padeda į eilę. Gavėjas tikrina ar yra eilėje naujų pranešimų. Jei eilėje yra naujas pranešimas, tai jis yra nuskaitomas ir apdorojamas. Nuskaityta žinutė iš eilės yra ištrinama.

## Versijos
* **JMS 1.0.2b** (2001 Birželio 25 d.)
* **JMS 1.1** (2002 Kovo 18 d.)

## JMS komponentai
Žemiau yra pateikiami JMS komponentai:
;JMS teikėjas (*provider*)
: Komunikacijos pranešimais sistema realizuojanti JMS API sąsają, suteikiančią valdymo ir kontrolės galimybes. JMS yra J2EE (nuo 1.3 versijos) dalis.
;JMS klientas (*client*)
: Programų sistema ar jos sudedamoji dalis, kuri sukuria ir siunčia arba priima ir apdoroja pranešimus. JMS klientas, kuris sukuria ir siunčia pranešimus vadinamas **siuntėju** (*producer*), o JMS klientas, kuris nuskaito ir apdoroja pranešimą - **gavėju** (*consumer*).
;JMS pranešimas (*message*)
: Tai objektas, kurio pagalba yra perduodama informacija tarp JMS klientų.
;JMS eilė (*queue*)
: Tai loginė struktūra, kur yra saugomi išsiųsti ir dar nenuskaityti pranešimai. Pranešimai yra pristatomi ta pačia tvarka, kaip ir buvo išsiųsti. Kai pranešimas yra perskaitomas, jis yra pašalinamas iš eilės
;JMS tema (*topic*)
: Tai loginė struktūra, kuri leidžia realizuoti pranešimų publikavimą ir jų pristatymą visiems prenumeratoriams

## Komunikavimo modeliai
JMS API sąsaja palaiko du komunikavimo modelius:
* vienas su vienu (*point - to - point*),
* publikuoti/prenumeruoti (*publish/subscribe*).

Modelis **vienas su vienu** yra pagrįstas JMS eilės, pranešimo, siuntėjo ir gavėjo sąvokomis. Kiekvienas pranešimas yra priskiriamas tam tikrai eilei. JMS klientas siuntėjas, norėdamas perduoti pranešimą, jį padeda į kliento gavėjo pranešimų aptarnavimui sukurtą eilę, iš kurios klientas gavėjas tuos pranešimus nuskaito. Eilėje yra saugomos visos žinutės, kurios buvo išsiųstos, bet nenuskaitytos ir kurių galiojimo terminas yra nepasibaigęs. Už eilių valdymą yra atsakingas JMS teikėjas.

Vienas su vienu komunikavimo modelis pasižymi šiomis savybėmis:
* Kiekvienas pranešimas turi tik vieną gavėją.
* Klientas gavėjas neprivalo būti aktyvus (veikiantis), kai klientas siuntėjas perduoda pranešimą ir atvirkščiai, klientas siuntėjas neprivalo būti aktyvus, kai klientas gavėjas nuskaito žinutes.
* Klientas gavėjas patvirtina sėkmingą žinutės apdorojimą.

Modelis **publikuoti/prenumeruoti** yra pagrįstas JMS temos, pranešimo, siuntėjo ir gavėjo sąvokomis. Naudojant šį apsikeitimo pranešimais modelį, visi siuntėjo pranešimai yra adresuojami tam tikrai temai. Gavėjas turi užsiprenumertuoti (užsiregistruoti sistemoje) tam tikros temos pranešimus, kad juos gautų. Nei siuntėjas nei gavėjas nieko nežino vienas apie kitą. Siuntėjo pranešimas temoje yra saugomas tol, kol visi tuo momentu užsiprenumeravę gavėjai jo negauna. Publikuoti/prenumeruoti bendravimo modelį būtų galima palyginti su anonimine pranešimų lenta. Už temų valdymą yra atsakingas JMS teikėjas.

Publikuoti/prenumeruoti komunikavimo modelis pasižymi šiomis savybėmis:
* Kiekvienas pranešimas gali turėti keletą gavėjų,
* Siuntėjas ir gavėjas yra, laiko atžvilgiu, priklausomi vienas nuo kito. Gavėjas gali gauti tik tuos pranešimus, kurie buvo publikuoti vėliau nei gavėjas užsiprenumeravo temos pranešimus, bei prenumerata turi būti aktyvi, kad gavėjas galėtų gauti publikuojamus pranešimus.

## API sąsaja

JMS API yra aprašyta Java pakete javax.jms. Žemiau yra pateikta keletą pagrindinių sąsajų:

* ConnectinoFactory
* Connection
* Destination
* MessageConsumer
* MessageProducer
* Message
* Session

## JMS teikėjo realizacijos

Norint naudoti JMS yra būtina turėti JMS teikėja, kuris valdytų sesijas, eiles, temas ir pranešimus. Yra keletas atvirojo kodo ir komercinių JMS teikėjų realizacijų.

Atvirojo kodo realizacijos:
* Apache ActiveMQ
* OpenJMS
* JBoss Messaging 
* JORAM 
* Open Message Queue 

Komercinės realizacijos:
* IMB Webpshere MQ
* TIBCO Enterprise Message Service 
* Progress Software SonicMQ 

## Nuorodos