# Jakarta Messaging

Jakarta Messaging (anteriorment Java Message Service or JMS API) és una API Message Oriented Middleware de Java que soluciona el problema del productors i consumidors d'enviament de missatges entre plataformes implantades amb tecnologies diferents, abstreient el programador dels detalls tècnics de la comunicació.
Jakarta Messaging és una part de Jakarta EE i fou definida originalment a Sun Microsystems abans de ser duta per la Java Community Process.

## Històric de versions

* JMS 1.0
* JMS 1.0.1 (5 d'octubre del 1998)
* JMS 1.0.1a (30 d'octubre del 1998)
* JMS 1.0.2 (17 de desembre del 1999)
* JMS 1.0.2a (23 de desembre del 1999)
* JMS 1.0.2b (27 d'agost del 2001)
* JMS 1.1 (12 d'abril del 2002)
* JMS 2.0 (21 de maig del 2013)
* JMS 2.0a (16 de març del 2015)
* JMS 3.0.0 (11 de novembre del 2020)

## Elements

Els conceptes més importants de JMS :

### proveïdor

    Sistema o aplicació que proporciona una plataforma per la transmissió de missatges. És per tant una implementació de la interfície JMS per un Message-Oriented Middleware (MOM). Els proveïdors estan implementats tant com a implementació d'un JMS de Java com un adaptador d'un MOM que no sigui Java.

### client

    Una aplicació o procés que produeix i/o consumeix missatges.

### productor

    Un client JMS que crea i envia missatges.

### consumidor

    Un client JMS que rep missatges.

### missatge

    Un objecte que conté les dades a ser transferides entre clients JMS.

### cua

    Una àrea d'espera que conté missatges que han estat enviats i esperen a ser llegits (per un sol consumidor). Com el propi nom de cua suggereix, els missatges es lliuren en l'ordre enviat. Un missatge és eliminat de la cua un cop el consumidor l'ha llegit.

### tòpic

    Un mecanisme de distribució per publicar missatges que són lliurats a múltiples subscriptors (consumidors). El missatge acaba sent eliminat depenent de la configuració del proveïdor. És útil en escenaris en els quals molts clients necessiten rebre informació actualitzada sobre un tema o esdeveniment específic.

### vpn

    xarxa virtual privada que es fa servir per protegir les comunicacions entre clients i proveïdors

## Models

L'API de JMS suporta dos models:
* Punt a punt (cua)
* Publicar/subscriure (tòpic)
Al model punt a punt o de cua, un productor envia missatges a una cua particular i un consumidor llegeix missatges de la cua. Aquí, el productor coneix la destinació del missatge i envia el missatge directament a la cua del consumidor. Es caracteritza pel següent:
* Només un consumidor rep el missatge
* El productor no ha d'estar executant al moment que el consumidor rep el missatge, ni el qui rep ha d'estar corrent al moment de l'enviament.
* Cada missatge processat amb èxit, és confirmat per receptor.
El model publicar/subscriure suporta publicar missatges per un tema concret. S'hi poden registrar zero o més subscriptors interessats a rebre missatges en un tema en particular. En aquest model, ni el publicador ni el subscriptor saben res un de l'altre. Un símil adequat seria el d'un butlletí d'enviament anònim. Les següents són característiques d'aquest model:
    Múltiples consumidors poden obtenir el missatge
    Hi ha una dependència de temps entre publicadors i subscriptors. El publicador ha de crear una subscripció perquè els clients s'hi puguin subscriure.
    El subscriptor ha de romandre continuadament actiu per rebre missatges, llevat que hi hagi un terme per la subscripció. En aquest cas, els missatges publicats mentre el subscriptor no està connectat es redistribuiran quan es reconnecti.
Usant Java, JMS aporta una manera de separar l'aplicació de la capa de transport o proveïment de dades. Les mateixes classes Java poden ser usades per comunicar amb diferents proveïdors JMS usant la informació JNDI pel proveïdor desitjat. Les classes primer usen una factoria de connexions per connectar a la cua o tema i llavors usen, emplenen i envien o publiquen els missatges. A la part de la recepció, els clients llavors reben o se subscriuen als missatges.

## API

La JMS API és proveïda pel paquet Java javax.jms.

### Interfície ConnectionFactory

Un objecte administrat que el client usa per crear una connexió al proveïdor JMS. Els clients JMS accedeixen a la factoria de connexions a través d'interfícies portables de manera que el codi no necessita ser canviat si canvia la implementació de sota. Els administradors configuren la factoria de connexions a l'espai de noms Java Naming and Directory Interface (JNDI) així que els client JMS el poden esbrinar. Depenent del tipus de missatge, els usuaris usaran una factoria de connexions en cua o per tema.

### Interfície Connection

Una vegada hem obtingut una factoria de connexions, una connexió a un proveïdor JMS pot ser creada. Una connexió representa un enllaç de comunicació entre l'aplicació i el servidor de missatges. Depenent del tipus de connexió, les connexions permeten que els usuaris creïn sessions per enviar i rebre missatge d'una cua o tema.

### Interfície Destination

Un objecte administrat que encapsula la identitat de la destinació d'un missatge, que és on els missatges són lliurats i consumits. És o una cua o un tema. L'administrador JMS crea aquests objectes i els usuaris els descobreixen usant (JNDI). Com la factoria de connexions, l'administrador pot crear dos tipus de destinacions: cues per Punt a Punt i temes per Publicar/Subscriure.

### Interfície Consumer.html Message Consumer

Un obejcte creat per una sessió. Rep missatges enviats a una destinació. El consumidor pot rebre missatges síncronament (blocant) o asíncronament (sense blocar) tant per missatgeria per cua com de tipus tema.

### Interfície MessageProducer

Un objecte creat per una sessió que envia missatges a una destinació. L'usuari pot crear i enviar a una destinació específica o crear un enviador genèric que especifica la destinació alhora que el missatge és enviat.

### Interfície Message

Un objecte que és enviat entre consumidors i productors, és a dir, d'una aplicació a una altra. Un missatge té tres parts principals:
* Una capçalera de missatge (opcional): Conté configuracions operacionals per identificar i encaminar missatges
* Un conjunt de propietats de missatge (opcional) : Conté propietats addicionals per suportar compatibilitat amb altres proveïdors o usuaris. Pot ser usat per crear camps personalitzats o filtres (selectors).
* Un cos de missatge (opcional) : Permet als usuaris crear cinc tipus de missatges (missatge de text, missatge de Map, missatge en bytes, missatge en stream i missatge objecte).
El missatge d'interfície és extremadament flexible i proveeix nombroses maneres de personalitzar els continguts d'un missatge.

### Interfície Session

Representa un context de fil únic per l'enviament i recepció de missatges. Una sessió és de fil únic així que els missatges se serialitzen, cosa que implica que es reben d'un en un, en l'ordre que són enviats. El benefici d'una sessió és que suporta transaccions. Si l'usuari selecciona suport de transacció, el context de la sessió sosté un grup de missatges fins que la transacció rep el commit, llavors és quan els missatges són lliurats. Abans de fer el commit, l'usuari pot cancel·lar els missatges usant una operació de rollback. Una sessió permet els usuaris crear productors de missatges per enviar-ne i consumidors de missatges per rebre'n.

## Implementacions de fabricant

Per usar JMS, cal tenir un proveïdor que manegui les sessions i les cues. N'hi ha de codi obert i de propietàries.
Articles sobre fabricants de codi obert:
* Apache ActiveMQ
* OpenJMS de l'OpenJMS Group
* JBoss Messaging de JBoss
* JORAM d'OW2
Una matriu de comparació exhaustiva de proveïdors JMS pot ser trobada a : http://www.theserverside.com/reviews/matrix.tss
Tot els servidors d'aplicacions J2EE 1.4 i posteriors tenen com a requeriment contenir un JMS implementat.

## Enllaços externs

* Visió general del JMS de Sun
* JSR 914 (JMS 1.0 i 1.1)
* Generic Resource Adapter de JMS
* «Java Message Service (JMS)».

## Vegeu també

* Microsoft Message Queuing - tecnologia similar, implementada per .NET

## Referències

* ↑ «Java Message Service» (en anglès). Oracle, 27-08-2021. [Consulta: 12 febrer 2023].
* ↑ «Java Message Service» (en anglès). Sun microsystems, 12-04-2002. [Consulta: 12 febrer 2023].
* ↑ «Java Message Service» (en anglès). Oracle America, Inc, 20-03-2013. [Consulta: 12 febrer 2023].
* ↑ «JMS 2.0 errata release (Rev a)» (en anglès), 05-07-2017. [Consulta: 12 febrer 2023].
* ↑ «Jakarta Messaging™ 3.0.0» (en anglès). Eclipse Foundation. [Consulta: 12 febrer 2023].
* 1 2 «Java Message Service (JMS)» (en anglès). Oracle. [Consulta: 12 febrer 2023].