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.
java kódovanie if else príkaz
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.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);} } }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.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);} } }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);} } }