Výukový program JMS
JMS (Java Message Service) je API, ktoré poskytuje možnosť vytvárať, odosielať a čítať správy. Poskytuje voľne prepojenú, spoľahlivú a asynchrónnu komunikáciu.
JMS je tiež známy ako služba zasielania správ.
Pochopenie správ
Posielanie správ je technika na komunikáciu aplikácií alebo softvérových komponentov.
JMS sa používa hlavne na odosielanie a prijímanie správ z jednej aplikácie do druhej.
Požiadavka JMS
Vo všeobecnosti používateľ odošle správu do aplikácie. Ak však chceme poslať správu z jednej aplikácie do druhej, musíme použiť JMS API.
Predstavte si scenár, jedna aplikácia A beží v INDII a ďalšia aplikácia B v USA. Na odoslanie správy z aplikácie A do aplikácie B musíme použiť JMS.
Výhoda JMS
1) Asynchrónne: Na prijatie správy sa od klienta nevyžaduje odoslanie žiadosti. Správa príde klientovi automaticky.
2) Spoľahlivý: Poskytuje záruku, že správa bude doručená.
Domény na odosielanie správ
V JMS existujú dva typy domén správ.
- Point-to-Point Messaging Domain
- Doména správ vydavateľa/odberateľa
1) Doména správ typu Point-to-Point (PTP).
V modeli PTP je jedna správa doručené jednému prijímaču iba. Tu, Fronta sa používa ako middleware orientovaný na správy (MOM).
Front je zodpovedný za podržanie správy, kým nebude príjemca pripravený.
V modeli PTP existuje žiadna časová závislosť medzi odosielateľom a príjemcom.
2) Vydavateľ/odberateľ (Pub/Sub) Doména správ
V modeli Pub/Sub je jedna správa doručené všetkým predplatiteľom . Je to ako vysielanie. Tu, Téma sa používa ako middleware orientovaný na správy, ktorý je zodpovedný za uchovávanie a doručovanie správ.
V modeli PTP existuje časová závislosť medzi vydavateľom a predplatiteľom.
Programovací model JMS
Príklad fronty JMS
Ak chcete vyvinúť príklad frontu JMS, musíte nainštalovať ľubovoľný aplikačný server. Tu používame sklenená rybka3 server, kde vytvárame dve JNDI.
- Vytvorte továreň na pripojenie s názvom myQueueConnectionFactory
- Vytvorte cieľový zdroj s názvom myQueue
Po vytvorení JNDI vytvorte aplikáciu servera a prijímača. Musíte spustiť server a prijímač v inej konzole. Tu používame eclipse IDE, predvolene sa otvára v inej konzole.
1) Vytvorte továreň na pripojenie a cieľový zdroj
Otvorte správcovskú konzolu servera podľa adresy URL http://localhost:4848
Prihláste sa pomocou používateľského mena a hesla.
Klikni na JMS Resource -> Connection Factory -> New , teraz napíšte názov fondu a vyberte typ zdroja ako QueueConnectionFactory, potom kliknite na tlačidlo ok.
Klikni na Zdroj JMS -> Prostriedky cieľa -> Nový , teraz napíšte názov JNDI a názov fyzického cieľa a potom kliknite na tlačidlo OK.
2) Vytvorte aplikáciu odosielateľa a príjemcu
Pozrime sa na kód odosielateľa a príjemcu. Všimnite si, že prijímač je pripojený s poslucháčom, ktorý sa spustí, keď používateľ odošle správu.
Súbor: 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);} } } Súbor: 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);} } } Súbor: 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);} } } Najprv spustite triedu Receiver a potom Sender.
Príklad témy JMS
Je to rovnaké ako front JMS, ale musíte zmeniť front na tému, odosielateľa na vydavateľa a príjemcu na predplatiteľa.
Musíte vytvoriť 2 JNDI s názvom myTopicConnectionFactory a mojaTéma .
Súbor: 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);} } } Súbor: 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);} } } Súbor: 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);} } }