***Java Message Service*** (***JMS***) ir *Java* ziņojumapmaiņas starpprogrammatūras lietojumprogrammas saskarne (*API*) ziņojumu sūtīšanai starp diviem vai vairākiem klientiem. *JMS API* definē interfeisus un saistīto semantiku, kas ļauj *Java* rakstītām programmām sazināties ar citām ziņojumapamaiņas realizācijām.

*JMS* ir *Java Platform, Enterprise Edition* (*Java EE*) daļa. Sākotnēji tā tika definēta ar *Sun Microsystems* izstrādātu specifikāciju, bet tagad projektu vada *Java Community process*.

*Java Message Service* nodrošina saziņu starp dažādiem izplatītas lietojumprogrammas komponentiem:

* asinhroni — saņēmēja klientam nav jāsaņem ziņojumi tajā pašā laikā, kad sūtītājs klients tos nosūta. Nosūtošajam klientam nav jāgaida, kad saņēmējs nosūtīs apstiprinājumu, tas var turpināt citus uzdevumus
* vaļīgu sasaisti — nosūtītājs un saņēmējs nav cieši saistīti, ziņojumi tiek nosūtīti ar starpnieka palīdzību
* uzticami — *JMS* nodrošina, ka ziņojums tiek piegādāts vienreiz un tikai vienu reizi. Zemāka uzticamības pakāpe ir pieejama lietojumprogrammām, kas var atļauties palaist garām ziņojumus vai saņemt ziņojumu dublikātus.

Modeļi
------

*JMS API* atbalsta divus atšķirīgus ziņojumapamaiņas modeļus:

* No punkta uz punktu (ziņojumu rinda)
* publicēšana — abonēšana

### No punkta uz punktu

No punkta uz punktu sistēmā ziņojumi tiek sūtīti atsevišķiem saņēmējiem, kas uztur ienākošo ziņojumu rindas. Šī ziņojumapmaiņas tipa pamatā ir ziņojumu rindu, sūtītāju (ražotāju) un saņēmēju (patērētāju) jēdziens. Katrs ziņojums tiek adresēts konkrētai rindai, un saņēmēji klienti izgūst ziņojumus no rindām, kas izveidotas, lai turētu savus ziņojumus. Lai gan jebkurš skaits ražotāju var nosūtīt ziņojumus uz rindu, katrs ziņojums ir garantēti jāpiegādā, un tikai vienam saņēmējam tas ir jāsaņem. Rindas uzglabā visus ziņojumus, kas tiem nosūtīti, līdz ziņojumi tiek patērēti vai kamēr beidzas to derīgums. Ja neviens patērētājs nav reģistrēts, lai uzņemtu ziņojumus, rinda tos notur līdz brīdim, kad patērētājs reģistrējas, lai tos patērētu. Sistēma negarantē, ka ziņojumi tiks saņemti tādā secībā, kādā tie tika nosūtīti.

### Publicēšana — abonēšana

"Publicēšana — abonēšana" modelis atbalsta ziņojumu publicēšanu noteiktā ziņojuma "tēmā". Abonenti var reģistrēt vēlmi saņemt ziņojumus, kas publicēti konkrētajā ziņojumu tēmā. Šajā modelī ne izdevējs, ne abonents nezina neko cits par citu.

Pastāv laika atkarība starp izdevējiem un abonentiem. Izdevējam ir jāizveido ziņu tēma klientiem, kas vēlas abonēt. Abonentam ir pastāvīgi jāpaliek aktīvam, lai saņemtu ziņas, ja vien tas nav izveidojis ilglaicīgu abonementu. Šādā gadījumā ziņojumi, kas tiek publicēti, kamēr abonents nav savienots, tiek pārsūtīti ikreiz, kad tiek veikta atkārtota savienošana. Atkarībā no tā, cik saņēmēji ir abonējuši tēmu, ziņojumu var saņemt vairāki patērētāji vai nesaņemt neviens.

*JMS* nodrošina veidu, kā datu sniegšanā nodalīt lietojumslāni no transporta slāņa. Vienas un tās pašas *Java* klases var izmantot, lai sazinātos ar dažādiem *JMS* nodrošinātājiem, izmantojot vajadzīgā nodrošinātāja *Java Naming and Directory Interface* (*JNDI*) informāciju. Klases vispirms izmanto savienojuma fabriku, lai izveidotu savienojumu ar rindu vai tēmu, un pēc tam izmanto aizpildīšanu un ziņojumu nosūtīšanu vai publicēšanu. Saņēmēja pusē pēc tam klienti saņem vai abonē ziņojumus.

*URI* shēma
-----------

*Java Message Service* *URI* shēmu RFC 6167 definē kā `jms:`.

Ārējās saites
-------------

* Package javax.jms Oracle
* JSR 343: Java Message Service 2.0