logo

Vadnica JMS

JMS (Java Message Service) je API, ki omogoča ustvarjanje, pošiljanje in branje sporočil. Zagotavlja ohlapno povezano, zanesljivo in asinhrono komunikacijo.

java naključna matematika naključna

JMS je znan tudi kot storitev sporočanja.


Razumevanje sporočil

Sporočila so tehnika za komuniciranje aplikacij ali komponent programske opreme.

JMS se v glavnem uporablja za pošiljanje in prejemanje sporočil iz ene aplikacije v drugo.


Zahteva JMS

Na splošno uporabnik pošlje sporočilo aplikaciji. Toda če želimo poslati sporočilo iz ene aplikacije v drugo, moramo uporabiti JMS API.

Razmislite o scenariju, ena aplikacija A se izvaja v INDIJI, druga aplikacija B pa se izvaja v ZDA. Za pošiljanje sporočila iz aplikacije A v B moramo uporabiti JMS.


Prednost JMS

1) Asinhrono: Za prejem sporočila stranki ni treba poslati zahteve. Sporočilo bo samodejno prispelo do stranke.

2) Zanesljivo: Zagotavlja, da je sporočilo dostavljeno.


Domene za sporočanje

V JMS obstajata dve vrsti domen za sporočanje.

  1. Domena za sporočanje od točke do točke
  2. Domena za pošiljanje sporočil založnika/naročnika

1) Domena za sporočanje od točke do točke (PTP).

V modelu PTP je eno sporočilo dostavljeno enemu prejemniku samo. tukaj, Čakalna vrsta se uporablja kot sporočilno usmerjena vmesna programska oprema (MOM).

Čakalna vrsta je odgovorna za zadržanje sporočila, dokler prejemnik ni pripravljen.

V modelu PTP obstaja brez časovne odvisnosti med pošiljateljem in prejemnikom.


2) Domena za pošiljanje sporočil založnik/naročnik (Pub/Sub).

V modelu Pub/Sub je eno sporočilo dostavljeno vsem naročnikom . To je kot oddajanje. tukaj, Tema se uporablja kot sporočilno usmerjena vmesna programska oprema, ki je odgovorna za hrambo in dostavo sporočil.

V modelu PTP obstaja odvisnost od časa med založnikom in naročnikom.



Programski model JMS


Primer čakalne vrste JMS

Če želite razviti primer čakalne vrste JMS, morate namestiti kateri koli aplikacijski strežnik. Tukaj uporabljamo steklena ribica3 strežnik, kjer ustvarjamo dva JNDI.

  1. Ustvari tovarno povezav z imenom myQueueConnectionFactory
  2. Ustvari ciljni vir z imenom myQueue

Po ustvarjanju JNDI ustvarite aplikacijo strežnika in sprejemnika. Strežnik in sprejemnik morate zagnati v drugi konzoli. Tukaj uporabljamo eclipse IDE, ki je privzeto odprt v drugi konzoli.

1) Ustvarite tovarno povezav in ciljni vir

Odprite skrbniško konzolo strežnika po URL-ju http://localhost:4848

Prijavite se z uporabniškim imenom in geslom.

Kliknite na Vir JMS -> Tovarne povezav -> Novo , zdaj napišite ime bazena in izberite vrsto vira kot QueueConnectionFactory, nato kliknite gumb v redu.

Kliknite na Vir JMS -> Ciljni viri -> Novo , zdaj napišite ime JNDI in ime fizičnega cilja, nato pa kliknite gumb v redu.

2) Ustvarite aplikacijo pošiljatelja in prejemnika

Oglejmo si kodo pošiljatelja in prejemnika. Upoštevajte, da je sprejemniku priložen poslušalec, ki bo priklican, ko uporabnik pošlje sporočilo.

Datoteka: 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);} } } 
Datoteka: 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);} } } 
Datoteka: 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);} } } 

Najprej zaženite razred prejemnik in nato razred pošiljatelj.


Primer teme JMS

Je enako kot čakalna vrsta JMS, vendar morate čakalno vrsto spremeniti v temo, pošiljatelja v založnika in prejemnika v naročnika.

Ustvariti morate 2 imenovana JNDI myTopicConnectionFactory in moja tema .

Datoteka: 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);} } } 
Datoteka: 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);} } } 
Datoteka: 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);} } }