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ésAz 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ésA JMS API kétféle modellt támogat:
- point-to-point modell
- publish-subscribe modell
Point-to-Point
szerkesztésA 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ésA 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ésA 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ésA JMS API javax.jms
csomagban található:
javax.jms.ConnectionFactory interfész
szerkesztésA 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ésHa 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ésA 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ésEgyszá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ésA 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ésEgyé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