logo

JMS apmācība

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.

  1. Tiešās ziņojumapmaiņas domēns
  2. 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.

  1. Izveidojiet savienojuma rūpnīcu ar nosaukumu myQueueConnectionFactory
  2. 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.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);} } } 
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.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);} } } 
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);} } }