JMS (Java Message Service) je API, které poskytuje zařízení pro vytváření, odesílání a čtení zpráv. Poskytuje volně propojenou, spolehlivou a asynchronní komunikaci.
html tagy
JMS je také známý jako služba zasílání zpráv.
Porozumění zasílání zpráv
Zasílání zpráv je technika pro komunikaci aplikací nebo softwarových komponent.
JMS se používá hlavně k odesílání a přijímání zpráv z jedné aplikace do druhé.
Požadavek JMS
Obecně uživatel odešle zprávu do aplikace. Ale pokud chceme poslat zprávu z jedné aplikace do druhé, musíme použít JMS API.
Zvažte scénář, jedna aplikace A běží v INDII a další aplikace B běží v USA. K odeslání zprávy z aplikace A do aplikace B musíme použít JMS.
Výhoda JMS
1) Asynchronní: Pro přijetí zprávy není nutné, aby klient zasílal požadavek. Zpráva přijde klientovi automaticky.
2) Spolehlivý: Poskytuje záruku, že zpráva bude doručena.
Domény pro zasílání zpráv
V JMS existují dva typy domén pro zasílání zpráv.
- Doména pro zasílání zpráv Point-to-Point
- Doména pro zasílání zpráv vydavatele/odběratele
1) Doména pro zasílání zpráv typu Point-to-Point (PTP).
V modelu PTP je jedna zpráva doručena jednomu příjemci pouze. Tady, Fronta se používá jako middleware orientovaný na zprávy (MOM).
Fronta je odpovědná za držení zprávy, dokud nebude příjemce připraven.
V modelu PTP existuje žádná časová závislost mezi odesílatelem a příjemcem.
2) Doména pro zasílání zpráv vydavatele/odběratele (Pub/Sub).
V modelu Pub/Sub je jedna zpráva doručena všem předplatitelům . Je to jako vysílání. Tady, Téma se používá jako middleware orientovaný na zprávy, který je zodpovědný za držení a doručování zpráv.
V modelu PTP existuje časová závislost mezi vydavatelem a předplatitelem.
Programovací model JMS
Příklad fronty JMS
Chcete-li vyvinout příklad fronty JMS, musíte nainstalovat libovolný aplikační server. Tady, my používáme skleněná rybka 3 server, kde vytváříme dvě JNDI.
- Vytvořit továrnu připojení s názvem myQueueConnectionFactory
- Vytvořte cílový prostředek s názvem myQueue
Po vytvoření JNDI vytvořte aplikaci serveru a přijímače. Musíte spustit server a přijímač v jiné konzoli. Zde používáme IDE Eclipse, ve výchozím nastavení se otevírá v jiné konzoli.
1) Vytvořte továrnu na připojení a cílový prostředek
Otevřete administrátorskou konzoli serveru pomocí adresy URL http://localhost:4848
Přihlaste se pomocí uživatelského jména a hesla.
Klikněte na JMS Resource -> Connection Factory -> New , nyní napište název fondu a vyberte Typ zdroje jako QueueConnectionFactory, poté klikněte na tlačítko OK.
Klikněte na Prostředky JMS -> Cílové prostředky -> Nový , nyní napište název JNDI a název fyzického cíle a poté klikněte na tlačítko OK.
2) Vytvořte aplikaci odesílatele a příjemce
Podívejme se na kód odesílatele a příjemce. Všimněte si, že přijímač je připojen k posluchači, který bude vyvolán, když uživatel odešle zprávu.
Soubor: 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);} } }Soubor: 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);} } }Soubor: 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);} } }
Nejprve spusťte třídu Receiver a poté třídu Sender.
Příklad tématu JMS
Je to stejné jako fronta JMS, ale musíte změnit frontu na téma, odesílatele na vydavatele a příjemce na odběratele.
Musíte vytvořit 2 JNDI s názvem myTopicConnectionFactory a moje téma .
Soubor: 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);} } }Soubor: 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);} } }Soubor: 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);} } }