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.
- Dominio di messaggistica punto a punto
- 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.
- Crea una factory di connessione denominata myQueueConnectionFactory
- 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.javaimport 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.javaimport 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);} } }