logo

JMS opetusohjelma

JMS (Java Message Service) on API, joka tarjoaa mahdollisuuden luoda, lähettää ja lukea viestejä. Se tarjoaa löyhästi kytketyn, luotettavan ja asynkronisen viestinnän.

joukko objekteja java

JMS tunnetaan myös viestintäpalveluna.


Viestien ymmärtäminen

Viestintä on tekniikka sovellusten tai ohjelmistokomponenttien viestimiseen.

JMS:ää käytetään pääasiassa viestien lähettämiseen ja vastaanottamiseen sovelluksesta toiseen.


JMS:n vaatimus

Yleensä käyttäjä lähettää viestin sovellukselle. Mutta jos haluamme lähettää viestin sovelluksesta toiseen, meidän on käytettävä JMS API:ta.

Harkitse skenaariota, jossa yksi sovellus A on käynnissä INTIAssa ja toinen sovellus B on käynnissä Yhdysvalloissa. Jotta voimme lähettää viestin A sovelluksesta B:lle, meidän on käytettävä JMS:ää.


JMS:n etu

1) Asynkroninen: Viestin vastaanottamiseksi asiakkaan ei tarvitse lähettää pyyntöä. Viesti saapuu automaattisesti asiakkaalle.

2) Luotettava: Se takaa viestin perille.


Viestintäalueet

JMS:ssä on kahdenlaisia ​​viestintäalueita.

  1. Point-to-Point Messaging Domain
  2. Julkaisijan/tilaajan viestiverkkotunnus

1) Point-to-Point (PTP) -viestintäverkkoalue

PTP-mallissa yksi viesti on toimitetaan yhdelle vastaanottajalle vain. Tässä, Jonottaa käytetään viestiorientoituneena väliohjelmistona (MOM).

Jono on vastuussa viestin säilyttämisestä, kunnes vastaanottaja on valmis.

PTP-mallissa on ei ajastusriippuvuutta lähettäjän ja vastaanottajan välillä.


2) Julkaisija/tilaaja (julkaisija/tilaaja) Messaging Domain

Pub/Sub-mallissa yksi viesti on toimitetaan kaikille tilaajille . Se on kuin lähetys. Tässä, Aihe käytetään viestisuuntautuneena väliohjelmistona, joka vastaa viestien säilyttämisestä ja toimittamisesta.

PTP-mallissa on ajoitusriippuvuus kustantajan ja tilaajan välillä.



JMS ohjelmointimalli


Esimerkki JMS-jonosta

JMS-jonoesimerkin kehittämiseksi sinun on asennettava mikä tahansa sovelluspalvelin. Täällä käytämme lasikala 3 palvelin, jossa luomme kaksi JNDI:tä.

  1. Luo yhteystehdas nimeltä myQueueConnectionFactory
  2. Luo kohderesurssi nimeltä myQueue

Kun olet luonut JNDI:n, luo palvelin- ja vastaanotinsovellus. Sinun on käytettävä palvelinta ja vastaanotinta eri konsoleissa. Täällä käytämme eclipse IDE:tä, se avataan oletuksena eri konsolissa.

1) Luo yhteystehdas ja kohderesurssi

Avaa palvelimen hallintakonsoli URL-osoitteen perusteella http://localhost:4848

Kirjaudu sisään käyttäjätunnuksella ja salasanalla.

Klikkaa JMS Resource -> Connection Factories -> Uusi , kirjoita nyt poolin nimi ja valitse resurssityypiksi QueueConnectionFactory ja napsauta sitten ok-painiketta.

Klikkaa JMS-resurssit -> Kohderesurssit -> Uusi , kirjoita nyt JNDI-nimi ja fyysisen kohteen nimi ja napsauta sitten ok-painiketta.

2) Luo lähettäjä- ja vastaanottajasovellus

Katsotaanpa lähettäjän ja vastaanottajan koodia. Huomaa, että Vastaanotin on liitetty kuuntelijaan, jota kutsutaan, kun käyttäjä lähettää viestin.

Tiedosto: 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);} } } 
Tiedosto: 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);} } } 
Tiedosto: 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);} } } 

Suorita ensin Vastaanottaja-luokka ja sitten Lähettäjä-luokka.


JMS-aiheesimerkki

Se on sama kuin JMS-jono, mutta sinun on vaihdettava jonosta aihe, lähettäjäksi julkaisijaksi ja vastaanottajaksi tilaajaksi.

Sinun on luotava 2 JNDI-nimeä myTopicConnectionFactory ja myTopic .

Tiedosto: 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);} } } 
Tiedosto: 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);} } } 
Tiedosto: 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);} } }