logo

Tutorial JMS

JMS (Java Message Service) este un API care oferă posibilitatea de a crea, trimite și citi mesaje. Oferă comunicații slab cuplate, fiabile și asincrone.

mysql update join

JMS este cunoscut și ca un serviciu de mesagerie.


Înțelegerea mesajelor

Mesageria este o tehnică de comunicare a aplicațiilor sau componentelor software.

JMS este folosit în principal pentru a trimite și primi mesaje de la o aplicație la alta.


Cerința JMS

În general, utilizatorul trimite un mesaj către aplicație. Dar, dacă vrem să trimitem mesaj de la o aplicație la alta, trebuie să folosim API-ul JMS.

Luați în considerare un scenariu, o aplicație A rulează în INDIA și o altă aplicație B rulează în SUA. Pentru a trimite mesaje de la aplicația A la B, trebuie să folosim JMS.


Avantajul JMS

1) asincron: Pentru a primi mesajul, clientul nu este obligat să trimită cererea. Mesajul va ajunge automat la client.

2) De încredere: Oferă asigurarea că mesajul este transmis.


Domenii de mesagerie

Există două tipuri de domenii de mesagerie în JMS.

  1. Domeniu de mesagerie punct-la-punct
  2. Domeniul de mesagerie pentru editor/abonat

1) Domeniul de mesagerie punct-la-punct (PTP).

În modelul PTP, un mesaj este livrat unui singur receptor numai. Aici, Coadă este folosit ca un middleware orientat pe mesaje (MOM).

Coada este responsabilă să rețină mesajul până când receptorul este gata.

În modelul PTP, există nici o dependență de timp între emiţător şi receptor.


2) Domeniul de mesagerie editor/abonat (Pub/Sub).

În modelul Pub/Sub, un mesaj este livrat tuturor abonaților . Este ca o difuzare. Aici, Subiect este folosit ca un middleware orientat spre mesaj, care este responsabil să păstreze și să livreze mesaje.

În modelul PTP, există dependență de timp între editor și abonat.



Model de programare JMS


Exemplu de coadă JMS

Pentru a dezvolta un exemplu de coadă JMS, trebuie să instalați orice server de aplicații. Aici, folosim pește de sticlă3 server unde creăm două JNDI.

  1. Creați o fabrică de conexiuni numită myQueueConnectionFactory
  2. Creați resursa destinație numită myQueue

După crearea JNDI, creați aplicația server și receptor. Trebuie să rulați serverul și receptorul într-o consolă diferită. Aici, folosim eclipse IDE, acesta este deschis în consolă diferită în mod implicit.

1) Creați o fabrică de conexiuni și o resursă de destinație

Deschideți consola de administrare a serverului după adresa URL http://localhost:4848

Conectați-vă cu numele de utilizator și parola.

Faceți clic pe JMS Resource -> Connection Factories -> Nou , acum scrieți numele pool-ului și selectați tipul de resurse ca QueueConnectionFactory, apoi faceți clic pe butonul ok.

Faceți clic pe JMS Resource -> Destination Resources -> New , acum scrieți numele JNDI și numele destinației fizice, apoi faceți clic pe butonul ok.

2) Creați aplicația expeditor și destinatar

Să vedem codul expeditorului și destinatarului. Rețineți că receptorul este atașat cu ascultător, care va fi invocat atunci când utilizatorul trimite un mesaj.

Fișier: MySender.java
 import java.io.BufferedReader; import java.io.InputStreamReader; import javax.naming.*; import javax.jms.*; public class MySender { public static void main(String[] args) { try { //Create and start connection InitialContext ctx=new InitialContext(); QueueConnectionFactory f=(QueueConnectionFactory)ctx.lookup('myQueueConnectionFactory'); QueueConnection con=f.createQueueConnection(); con.start(); //2) create queue session QueueSession ses=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Queue object Queue t=(Queue)ctx.lookup('myQueue'); //4)create QueueSender object QueueSender sender=ses.createSender(t); //5) create TextMessage object TextMessage msg=ses.createTextMessage(); //6) write message BufferedReader b=new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.println('Enter Msg, end to terminate:'); String s=b.readLine(); if (s.equals('end')) break; msg.setText(s); //7) send message sender.send(msg); System.out.println('Message successfully sent.'); } //8) connection close con.close(); }catch(Exception e){System.out.println(e);} } } 
Fișier: MyReceiver.java
 import javax.jms.*; import javax.naming.InitialContext; public class MyReceiver { public static void main(String[] args) { try{ //1) Create and start connection InitialContext ctx=new InitialContext(); QueueConnectionFactory f=(QueueConnectionFactory)ctx.lookup('myQueueConnectionFactory'); QueueConnection con=f.createQueueConnection(); con.start(); //2) create Queue session QueueSession ses=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Queue object Queue t=(Queue)ctx.lookup('myQueue'); //4)create QueueReceiver QueueReceiver receiver=ses.createReceiver(t); //5) create listener object MyListener listener=new MyListener(); //6) register the listener object with receiver receiver.setMessageListener(listener); System.out.println('Receiver1 is ready, waiting for messages...'); System.out.println('press Ctrl+c to shutdown...'); while(true){ Thread.sleep(1000); } }catch(Exception e){System.out.println(e);} } } 
Fișier: MyListener.java
 import javax.jms.*; public class MyListener implements MessageListener { public void onMessage(Message m) { try{ TextMessage msg=(TextMessage)m; System.out.println('following message is received:'+msg.getText()); }catch(JMSException e){System.out.println(e);} } } 

Rulați mai întâi clasa Receiver, apoi clasa Sender.


Exemplu de subiect JMS

Este la fel ca JMS Queue, dar trebuie să schimbați Queue la Topic, Sender to Publisher și Receiver to Subscriber.

Trebuie să creați 2 JNDI numite myTopicConnectionFactory și subiectul meu .

Fișier: MySender.java
 import java.io.BufferedReader; import java.io.InputStreamReader; import javax.naming.*; import javax.jms.*; public class MySender { public static void main(String[] args) { try { //Create and start connection InitialContext ctx=new InitialContext(); TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup('myTopicConnectionFactory'); TopicConnection con=f.createTopicConnection(); con.start(); //2) create queue session TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Topic object Topic t=(Topic)ctx.lookup('myTopic'); //4)create TopicPublisher object TopicPublisher publisher=ses.createPublisher(t); //5) create TextMessage object TextMessage msg=ses.createTextMessage(); //6) write message BufferedReader b=new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.println('Enter Msg, end to terminate:'); String s=b.readLine(); if (s.equals('end')) break; msg.setText(s); //7) send message publisher.publish(msg); System.out.println('Message successfully sent.'); } //8) connection close con.close(); }catch(Exception e){System.out.println(e);} } } 
Fișier: MyReceiver.java
 import javax.jms.*; import javax.naming.InitialContext; public class MyReceiver { public static void main(String[] args) { try { //1) Create and start connection InitialContext ctx=new InitialContext(); TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup('myTopicConnectionFactory'); TopicConnection con=f.createTopicConnection(); con.start(); //2) create topic session TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Topic object Topic t=(Topic)ctx.lookup('myTopic'); //4)create TopicSubscriber TopicSubscriber receiver=ses.createSubscriber(t); //5) create listener object MyListener listener=new MyListener(); //6) register the listener object with subscriber receiver.setMessageListener(listener); System.out.println('Subscriber1 is ready, waiting for messages...'); System.out.println('press Ctrl+c to shutdown...'); while(true){ Thread.sleep(1000); } }catch(Exception e){System.out.println(e);} } } 
Fișier: MyListener.java
 import javax.jms.*; public class MyListener implements MessageListener { public void onMessage(Message m) { try{ TextMessage msg=(TextMessage)m; System.out.println('following message is received:'+msg.getText()); }catch(JMSException e){System.out.println(e);} } }