logo

Výukový program JMS

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.

  1. Doména pro zasílání zpráv Point-to-Point
  2. 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.

  1. Vytvořit továrnu připojení s názvem myQueueConnectionFactory
  2. 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.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);} } } 
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.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);} } } 
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);} } }