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
[szerkesztés]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]A JMS API kétféle modellt támogat:
- point-to-point modell
- publish-subscribe modell
Point-to-Point
[szerkesztés]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]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]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]A JMS API javax.jms
csomagban található:
javax.jms.ConnectionFactory interfész
[szerkesztés]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]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]Ü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]Ü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]Ü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]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
[szerkesztés]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]- JMS 1.0.2b (2001. június 25.)
- JMS 1.1 (2002. március 18.)
- JMS 2.0 (2013. május 21.)
A JMS 2.0 a Java Community Process tartja karban JSR 343 néven.
Provider implementációk
[szerkesztés]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:
- Apache ActiveMQ
- Apache Qpid
- OpenJMS
- JBoss Messaging
- JORAM
Nevezetesebb kereskedelmi implementációk:
- Oracle Weblogic
- Oracle AQ
- Sun Java System Message Queue
- WebSphere MQ az IBM-től (korábban MQSeries)
- SAP NetWeaver
- SonicMQ
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]- Sun JMS áttekintés
- JMS ismertető a Sun-tól
- JSR 914 (JMS 1.0 és 1.1)
Kapcsolódó szócikkek
[szerkesztés]Egyéb üzenetkezelő technológiák, amelyek nem implementálják a JMS API-t:
- Amazon Simple Queue Service - az Amazon.com által kínált üzenetkezelő architektúra. A felhasználók hozzáférést bérelhetnek, így nem kell saját szervert fenntartaniuk.
- Microsoft Message Queuing - hasonló üzenetkezelő technológia a .Net rendszerhez