logo

Esercitazione JMS

JMS (Java Message Service) è un'API che fornisce la possibilità di creare, inviare e leggere messaggi. Fornisce una comunicazione liberamente accoppiata, affidabile e asincrona.

parola chiave statica in Java

JMS è anche noto come servizio di messaggistica.


Comprendere la messaggistica

La messaggistica è una tecnica per comunicare applicazioni o componenti software.

JMS viene utilizzato principalmente per inviare e ricevere messaggi da un'applicazione all'altra.


Requisito di JMS

In genere, l'utente invia un messaggio all'applicazione. Ma, se vogliamo inviare messaggi da un'applicazione a un'altra, dobbiamo utilizzare l'API JMS.

Consideriamo uno scenario in cui un'applicazione A è in esecuzione in INDIA e un'altra applicazione B è in esecuzione negli Stati Uniti. Per inviare un messaggio da un'applicazione a B, dobbiamo utilizzare JMS.


Vantaggio di JMS

1) Asincrono: Per ricevere il messaggio, il client non è tenuto a inviare una richiesta. Il messaggio arriverà automaticamente al cliente.

2) Affidabile: Fornisce la garanzia che il messaggio venga recapitato.


Domini di messaggistica

Esistono due tipi di domini di messaggistica in JMS.

  1. Dominio di messaggistica punto a punto
  2. Dominio di messaggistica dell'editore/abbonato

1) Dominio di messaggistica punto a punto (PTP).

Nel modello PTP, un messaggio è consegnato a un destinatario soltanto. Qui, Coda viene utilizzato come middleware orientato ai messaggi (MOM).

La coda è responsabile di trattenere il messaggio finché il destinatario non è pronto.

Nel modello PTP, c'è nessuna dipendenza temporale tra mittente e destinatario.


2) Dominio di messaggistica editore/abbonato (Pub/Sub).

Nel modello Pub/Sub, un messaggio è consegnato a tutti gli iscritti . È come trasmettere in onda. Qui, Argomento viene utilizzato come middleware orientato ai messaggi responsabile di conservare e consegnare i messaggi.

Nel modello PTP, c'è dipendenza temporale tra editore e abbonato.



Modello di programmazione JMS


Esempio di coda JMS

Per sviluppare l'esempio della coda JMS, è necessario installare qualsiasi server delle applicazioni. Qui stiamo usando pescevetro3 server dove stiamo creando due JNDI.

  1. Crea una factory di connessione denominata myQueueConnectionFactory
  2. Crea la risorsa di destinazione denominata myQueue

Dopo aver creato JNDI, creare l'applicazione server e ricevente. È necessario eseguire server e ricevitore su console diverse. Qui stiamo utilizzando l'IDE Eclipse, che per impostazione predefinita viene aperto in una console diversa.

1) Creare una factory di connessione e una risorsa di destinazione

Apri la console di amministrazione del server tramite l'URL http://localhost:4848

Accedi con il nome utente e la password.

Clicca sul Risorsa JMS -> Factory di connessione -> Nuovo , ora scrivi il nome del pool e seleziona il tipo di risorsa come QueueConnectionFactory, quindi fai clic sul pulsante OK.

Clicca sul Risorsa JMS -> Risorse di destinazione -> Nuovo , ora scrivi il nome JNDI e il nome della destinazione fisica, quindi fai clic sul pulsante OK.

2) Creare un'applicazione mittente e ricevente

Vediamo il codice Mittente e Destinatario. Tieni presente che il destinatario è collegato al listener che verrà richiamato quando l'utente invia il messaggio.

File: 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);} } } 
File: MioReceiver.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);} } } 
File: MioListener.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);} } } 

Esegui prima la classe Receiver e poi la classe Sender.


Esempio di argomento JMS

È uguale a Coda JMS, ma è necessario modificare Coda in Argomento, Mittente in Editore e Destinatario in Sottoscrittore.

È necessario creare 2 JNDI denominati myTopicConnectionFactory E mio argomento .

File: 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);} } } 
File: MioReceiver.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);} } } 
File: MioListener.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);} } }