Java Message Service

A Wikipédiából, a szabad enciklopédiából

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[szerkesztés | forrásszöveg szerkesztése]

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[szerkesztés | forrásszöveg szerkesztése]

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

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

Point-to-Point[szerkesztés | forrásszöveg szerkesztése]

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[szerkesztés | forrásszöveg szerkesztése]

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[szerkesztés | forrásszöveg szerkesztése]

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[szerkesztés | forrásszöveg szerkesztése]

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

javax.jms.ConnectionFactory interfész[szerkesztés | forrásszöveg szerkesztése]

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[szerkesztés | forrásszöveg szerkesztése]

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[szerkesztés | forrásszöveg szerkesztése]

Ü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[szerkesztés | forrásszöveg szerkesztése]

Ü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[szerkesztés | forrásszöveg szerkesztése]

Ü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[szerkesztés | forrásszöveg szerkesztése]

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[szerkesztés | forrásszöveg szerkesztése]

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[szerkesztés | forrásszöveg szerkesztése]

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

Provider implementációk[szerkesztés | forrásszöveg szerkesztése]

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[szerkesztés | forrásszöveg szerkesztése]

Kapcsolódó szócikkek[szerkesztés | forrásszöveg szerkesztése]

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