JMS (Java Message Service) ir API, kas nodrošina iespēju izveidot, nosūtīt un lasīt ziņojumus. Tas nodrošina brīvi savienotu, uzticamu un asinhronu saziņu.
režģa izkārtojums
JMS ir pazīstams arī kā ziņojumapmaiņas pakalpojums.
Izpratne par ziņojumapmaiņu
Ziņapmaiņa ir lietojumprogrammu vai programmatūras komponentu saziņas paņēmiens.
JMS galvenokārt izmanto, lai nosūtītu un saņemtu ziņojumus no vienas lietojumprogrammas uz citu.
JMS prasība
Parasti lietotājs nosūta ziņojumu lietojumprogrammai. Bet, ja mēs vēlamies nosūtīt ziņojumu no vienas lietojumprogrammas uz otru, mums ir jāizmanto JMS API.
Apsveriet scenāriju, ka viena lietojumprogramma A darbojas INDIJA, bet cita lietojumprogramma B darbojas ASV. Lai nosūtītu ziņojumu no lietojumprogrammas A uz B, mums ir jāizmanto JMS.
JMS priekšrocības
1) Asinhrons: Lai saņemtu ziņojumu, klientam nav jānosūta pieprasījums. Ziņojums klientam nonāks automātiski.
2) Uzticams: Tas nodrošina pārliecību, ka ziņojums tiek piegādāts.
Ziņapmaiņas domēni
JMS ir divu veidu ziņojumapmaiņas domēni.
- Tiešās ziņojumapmaiņas domēns
- Izdevēja/abonenta ziņojumapmaiņas domēns
1) No punkta uz punktu (PTP) ziņojumapmaiņas domēns
PTP modelī viens ziņojums ir piegādāts vienam saņēmējam tikai. Šeit, Rinda tiek izmantota kā uz ziņojumu orientēta starpprogrammatūra (MOM).
Rinda ir atbildīga par ziņojuma aizturēšanu, līdz saņēmējs ir gatavs.
PTP modelī ir nav laika atkarības starp sūtītāju un saņēmēju.
2) Izdevēja/abonenta (Pub/Sub) ziņojumapmaiņas domēns
Pub/Sub modelī viens ziņojums ir piegādāts visiem abonentiem . Tas ir kā apraide. Šeit, Temats tiek izmantota kā uz ziņojumiem orientēta starpprogrammatūra, kas ir atbildīga par ziņojumu glabāšanu un piegādi.
PTP modelī ir laika atkarība starp izdevēju un abonentu.
JMS programmēšanas modelis
JMS rindas piemērs
Lai izstrādātu JMS rindas piemēru, jums jāinstalē jebkurš lietojumprogrammu serveris. Lūk, mēs izmantojam stikla zivs3 serveris, kurā veidojam divus JNDI.
- Izveidojiet savienojuma rūpnīcu ar nosaukumu myQueueConnectionFactory
- Izveidojiet galamērķa resursu ar nosaukumu myQueue
Pēc JNDI izveides izveidojiet servera un uztvērēja lietojumprogrammu. Serveris un uztvērējs ir jāpalaiž dažādās konsolēs. Šeit mēs izmantojam eclipse IDE, tas pēc noklusējuma tiek atvērts citā konsolē.
1) Izveidojiet savienojuma rūpnīcu un galamērķa resursu
Atveriet servera administratora konsoli pēc URL http://localhost:4848
Piesakieties ar lietotājvārdu un paroli.
Noklikšķiniet uz JMS resurss -> Savienojumu rūpnīcas -> Jauns , tagad ierakstiet pūla nosaukumu un atlasiet Resource Type kā QueueConnectionFactory, pēc tam noklikšķiniet uz pogas Labi.
Noklikšķiniet uz JMS resurss -> Galamērķa resursi -> Jauns , tagad ierakstiet JNDI nosaukumu un fiziskā galamērķa nosaukumu, pēc tam noklikšķiniet uz pogas Labi.
2) Izveidojiet sūtītāja un saņēmēja lietojumprogrammu
Apskatīsim sūtītāja un saņēmēja kodu. Ņemiet vērā, ka uztvērējs ir pievienots klausītājam, kas tiks izsaukts, kad lietotājs nosūtīs ziņojumu.
Fails: 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);} } }Fails: 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);} } }Fails: 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);} } }
Vispirms palaidiet uztvērēja klasi, pēc tam sūtītāja klasi.
JMS tēmas piemērs
Tas ir tāds pats kā JMS rinda, taču jums ir jāmaina rinda uz tēmu, sūtītājs uz izdevēju un saņēmējs uz abonentu.
Jums ir jāizveido 2 JNDI ar nosaukumu myTopicConnectionFactory un mana tēma .
Fails: 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);} } }Fails: 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);} } }Fails: 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);} } }