Java Message Service

A Java Message Service (röviden JMS) egy Java API, amellyel üzeneteket lehet küldeni különböző szoftverkomponensek között. A JEE specifikáció részét képező JMS specifikációt a Java Community Process keretében fejlesztik a JSR 914 dokumentumban.

Az üzenetküldést implementáló architektúrákra szoktak message-oriented middleware (röviden MOM) néven is hivatkozni.

Az üzenetezés általában

Az elosztott rendszerekben az üzenetküldés egy úgynevezett lazán csatolt kommunikáció. Ez arra utal, hogy a szoftverkomponensek nem közvetlenül kommunikálnak egymással, hanem egy köztes (üzenetkezelő) komponens segítségével. A lazán csatoltság egyik előnye, hogy az üzenetek küldőinek nem is kell pontosan ismerniük a fogadókat, mert minden kommunikáció az üzenetsoron keresztül történik. (Ezzel ellentétes az úgynevezett szorosan csatolt kommunikáció, ami például a TCP socket-eknél, a CORBA-nál és az RMI-nél figyelhető meg.)

Modellek

A JMS API kétféle modellt támogat:

  • point-to-point modell
  • publish-subscribe modell

Point-to-Point

A point-to-point modell esetében a producer üzeneteket küld az üzenetsorba, a consumer pedig kiolvassa azokat a sorból. Ebben az esetben a producer ismeri az üzenet fogadóját és közvetlenül a fogadóhoz tartozó sorba pakolja az üzenetet. Ez az eset a következőkkel jellemezhető:

  • Egy üzenetet csak egy fogadó kap meg.
  • A producer-nek nem kell futnia, amikor a consumer megkapja az üzenetet és a consumer-nek sem kell futnia, amikor a producer elküldi az üzenetet.
  • Minden sikeresen kézbesített üzenetet visszaigazol a consumer.

Publish/Subscribe

A publish/subscribe modell adott témához (angolul topic) tartozó üzenetek publikálását támogatja. Nulla vagy több subscriber regisztrálhat egy-egy topic-ra. Ebben a modellben a kommunikáló felek nem ismerik egymást. Egy jó metafora ennek a szemléltetésére az anonim üzenőfal. Főbb jellemzői a következők:

  • Egy üzenetet több fogyasztó is megkaphat.
  • A publisher és a subscriber között fennáll egy időbeli függőség. A publisher-nek létre kell hoznia egy topic-ot, amelyre a kliensek feliratkozhatnak. A feliratkozott klienseknek folyamatosan aktívnak kell maradniuk ahhoz, hogy megkapják az üzeneteket vagy tartós feliratkozást kell használniuk (angolul durable subscription). Az utóbbi esetben újracsatlakozáskor minden üzenetet megkap a fogyasztó.

Elemei

A JMS az alábbi elemeket foglalja magába: [1]

JMS provider (magyarul szolgáltató)
A JMS szolgáltató nem más, mint egy Message Oriented Middleware (MOM) implementáció. A szolgáltató lehet tiszta Java implementáció, de lehet nemjavás MOM implementációhoz készített javás adapter is.
JMS kliens
Egy üzeneteket küldő és/vagy fogadó alkalmazás vagy folyamat.
JMS producer
Üzeneteket készítő és küldő JMS kliens.
JMS consumer
Üzeneteket fogadó (más szóval fogyasztó) JMS kliens.
JMS message
A JMS kliensek között szállított adatokat tartalmazó objektum.
JMS queue
Sor adatszerkezet, ahol az elküldött és a kézbesítésre váró üzenetek tárolódnak. Az üzeneteket a küldés sorrendjében kézbesítik, a kézbesített üzenetek törlődnek a sorból.
JMS topic
Elosztási mechanizmus több fogadónak szánt üzenetekhez.

API

A JMS API javax.jms csomagban található:

javax.jms.ConnectionFactory interfész

A szolgáltatóhoz való kapcsolódásra használhatják fel a kliensek ezt az interfészt. A kódot nem kell átírni, ha megváltozik a JMS implementáció. Adminisztrátori feladat a ConnectionFactory konfigurálása a JNDI névtérben, ahol a kliensek megtalálják. Az üzenet típusától függően használják a QueueConnectionFactory illetve a TopicConnectionFactory specializációkat.

javax.jms.Connection interfész

Ha megvan a ConnectionFactory, akkor létrehozható a kapcsolat a JMS szolgáltatóval. A Connection interfész képviseli a kapcsolatot az alkalmazás és az üzenetkezelő szerver között. A kapcsolat típusától függően lehetőség van üzenetek küldésére és fogadására üzenetsoron illetve topic-on keresztül.

javax.jms.Destination interfész

Üzenetek úticélját reprezentálja. Lehet sor is és topic is egyaránt. A JMS adminisztrátor hozza létre ezeket az objektumokat, a szoftverkomponensek pedig a JNDI-n keresztül fedezik fel őket. A ConnectionFactory esetéhez hasonlóan ebből is kétfélét lehet csinálni: sorokat a point-to-point kommunikációhoz és témákat (topic-okat) a publish/subscribe kommunikációhoz.

javax.jms.MessageConsumer interfész

Üzenetek fogadására alkalmas. A fogyasztó szinkron (blokkoló) és aszinkron (nem blokkoló) módon is fogadhat üzeneteket mindkét üzenetkezelési modellben.

javax.jms.MessageProducer interfész

Üzenetek küldésére alkalmas. Konkrét címzetthez is lehet rendelni, de lehet általános küldő is, amelynek mindig egy konkrét üzenet küldésekor adják meg a címzettet.

javax.jms.Message interfész

A termelő és a fogyasztó szoftverkomponensek között küldött objektum. Az üzenet három fő részből áll:

  1. header (kötelező): Operatív beállításokat tartalmaz az üzenetek azonosításához és irányításához.
  2. üzenettulajdonságok (opcionális): Egyedi, testreszabott mezőket és szűrőket tartalmazhat.
  3. üzenettest (opcionális): Ötféle üzenettípus létrehozására alkalmas (text message, map message, bytes message, stream message és object message).

javax.jms.Session interfész

Egyszálú kontextust biztosít üzenetek küldésére és fogadására. Az egyszálúság itt azt jelenti, hogy az üzeneteket sorbarendezik és egyesével kézbesítik a küldés sorrendjében. Támogatja a tranzakciókat is, a kontextus képes tárolni üzenetek egy csoportját a tranzakció végrehajtásáig, azt követően pedig kézbesíti őket. Ha a tranzakciót visszagörgetik (rollback), akkor a rendszer nem kézbesíti az üzeneteket. A Session segítségével lehet üzenetküldőket és fogadókat létrehozni.

Verziótörténet

A JMS 2.0 a Java Community Process tartja karban JSR 343 néven.

Provider implementációk

A JMS használatához szükség van egy JMS szolgáltatóra (provider), amely kezelni tudja a munkameneteket (session) és a sorokat (queue). Szolgáltató léteznek szabad szoftver implementációk, nyílt forráskód implementációk és kereskedelmi szoftverek is.

Nevezetesebb nyílt forráskódú implementációk:

Nevezetesebb kereskedelmi implementációk:

A különböző JMS implementációkról kimerítő összehasonlító táblázat szerepel itt: http://www.theserverside.com/reviews/matrix.tss

A Java EE specifikációnak az 1.4 verziótól kezdve része a JMS szolgáltató.

További információk

Kapcsolódó szócikkek

Egyéb üzenetkezelő technológiák, amelyek nem implementálják a JMS API-t:

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!