logo

JMS pamoka

JMS (Java Message Service) yra API, kuri suteikia galimybę kurti, siųsti ir skaityti pranešimus. Tai užtikrina laisvai susietą, patikimą ir asinchroninį ryšį.

Armstrongo numeris

JMS taip pat žinomas kaip pranešimų siuntimo paslauga.


Susirašinėjimo žinutėmis supratimas

Susirašinėjimas yra būdas bendrauti programomis ar programinės įrangos komponentais.

JMS daugiausia naudojamas siųsti ir gauti pranešimus iš vienos programos į kitą.


JMS reikalavimas

Paprastai vartotojas siunčia pranešimą programai. Bet jei norime siųsti žinutę iš vienos programos į kitą, turime naudoti JMS API.

Apsvarstykite scenarijų, kai viena programa A veikia INDIJOJE, o kita programa B veikia JAV. Norėdami išsiųsti pranešimą iš programos A į B, turime naudoti JMS.


JMS privalumas

1) Asinchroninis: Norėdami gauti pranešimą, klientas neprivalo siųsti užklausos. Pranešimas klientui pasieks automatiškai.

2) Patikimas: Tai užtikrina, kad pranešimas bus pristatytas.


Pranešimų domenai

JMS yra dviejų tipų pranešimų domenai.

  1. Tiesioginių pranešimų domenas
  2. Leidėjo / abonento pranešimų domenas

1) Tiesioginio taško (PTP) pranešimų domenas

PTP modelyje vienas pranešimas yra pristatyta vienam gavėjui tik. Čia Eilė naudojama kaip į pranešimus orientuota tarpinė programinė įranga (MOM).

Eilė yra atsakinga už pranešimo laikymą, kol gavėjas bus pasirengęs.

PTP modelyje yra nėra priklausomybės nuo laiko tarp siuntėjo ir gavėjo.


2) Leidėjo/prenumeratoriaus (Pub/Sub) pranešimų domenas

Pub/Sub modelyje vienas pranešimas yra pristatyta visiems abonentams . Tai tarsi transliacija. Čia Tema naudojama kaip į pranešimus orientuota tarpinė programinė įranga, atsakinga už pranešimų laikymą ir pristatymą.

PTP modelyje yra priklausomybė nuo laiko tarp leidėjo ir prenumeratoriaus.



JMS programavimo modelis


JMS eilės pavyzdys

Norėdami sukurti JMS eilės pavyzdį, turite įdiegti bet kurį programų serverį. Čia mes naudojame stiklinė žuvis3 serveryje, kuriame kuriame du JNDI.

  1. Sukurkite ryšio gamyklą pavadinimu myQueueConnectionFactory
  2. Sukurkite paskirties išteklių pavadinimu myQueue

Sukūrę JNDI, sukurkite serverio ir imtuvo programą. Turite paleisti serverį ir imtuvą skirtingose ​​konsolėse. Čia mes naudojame eclipse IDE, pagal numatytuosius nustatymus jis atidaromas kitoje konsolėje.

1) Sukurkite ryšio gamyklą ir paskirties šaltinį

Atidarykite serverio administratoriaus konsolę naudodami URL http://localhost:4848

Prisijunkite naudodami vartotojo vardą ir slaptažodį.

Spustelėkite ant JMS ištekliai -> Ryšio gamyklos -> Nauji , dabar parašykite baseino pavadinimą ir pasirinkite išteklių tipą kaip QueueConnectionFactory, tada spustelėkite mygtuką Gerai.

Spustelėkite ant JMS ištekliai -> Paskirties ištekliai -> Nauji , dabar parašykite JNDI pavadinimą ir fizinės paskirties vietos pavadinimą, tada spustelėkite mygtuką Gerai.

2) Sukurkite siuntėjo ir gavėjo programą

Pažiūrėkime siuntėjo ir gavėjo kodus. Atminkite, kad imtuvas yra prijungtas prie klausytojo, kuris bus iškviestas, kai vartotojas išsiųs pranešimą.

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

Pirmiausia paleiskite gavėjo klasę, tada siuntėjo klasę.


JMS temos pavyzdys

Tai tas pats, kas JMS eilė, bet jūs turite pakeisti eilę į temą, siuntėjas į leidėją ir gavėją į abonentą.

Turite sukurti 2 JNDI pavadinimus myTopicConnectionFactory ir mano tema .

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