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:
- header (kötelező): Operatív beállításokat tartalmaz az üzenetek azonosításához és irányításához.
- üzenettulajdonságok (opcionális): Egyedi, testreszabott mezőket és szűrőket tartalmazhat.
- ü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ó.
Kapcsolódó szócikkek
Egyéb üzenetkezelő technológiák, amelyek nem implementálják a JMS API-t: