logo

JMS Vodič

JMS (Java Message Service) je API koji omogućuje stvaranje, slanje i čitanje poruka. Omogućuje labavo spregnutu, pouzdanu i asinkronu komunikaciju.

binarno stablo mail order traversal

JMS je također poznat kao servis za razmjenu poruka.


Razumijevanje poruka

Razmjena poruka je tehnika za komunikaciju aplikacija ili softverskih komponenti.

JMS se uglavnom koristi za slanje i primanje poruka iz jedne aplikacije u drugu.


Zahtjevi JMS-a

Općenito, korisnik šalje poruku aplikaciji. Ali, ako želimo poslati poruku iz jedne aplikacije u drugu, moramo koristiti JMS API.

Razmotrimo scenarij, jedna aplikacija A radi u INDIJI, a druga aplikacija B radi u SAD-u. Za slanje poruke iz A aplikacije u B, moramo koristiti JMS.


Prednost JMS-a

1) Asinkrono: Da bi primio poruku, klijent nije dužan poslati zahtjev. Poruka će automatski stići klijentu.

2) Pouzdan: Osigurava da je poruka isporučena.


Domene za slanje poruka

Postoje dvije vrste domena za razmjenu poruka u JMS-u.

  1. Domena za razmjenu poruka od točke do točke
  2. Domena za slanje poruka izdavača/pretplatnika

1) Domena za razmjenu poruka od točke do točke (PTP).

U PTP modelu, jedna poruka je predati jednom primatelju samo. Ovdje, Red koristi se kao međuprogram orijentiran na poruke (MOM).

Red je odgovoran za zadržavanje poruke dok primatelj ne bude spreman.

U PTP modelu postoji nema vremenske ovisnosti između pošiljatelja i primatelja.


2) Domena za slanje poruka izdavača/pretplatnika (Pub/Sub).

U modelu Pub/Sub jedna je poruka dostavljen svim pretplatnicima . To je poput emitiranja. Ovdje, Tema koristi se kao posredni softver orijentiran na poruke koji je odgovoran za čuvanje i isporuku poruka.

U PTP modelu postoji vremenska ovisnost između izdavača i pretplatnika.



JMS programski model


Primjer JMS reda čekanja

Da biste razvili primjer JMS reda čekanja, trebate instalirati bilo koji poslužitelj aplikacija. Evo, mi koristimo staklena riba3 poslužitelj na kojem stvaramo dva JNDI.

  1. Stvorite tvornicu povezivanja pod nazivom myQueueConnectionFactory
  2. Stvorite odredišni resurs pod nazivom myQueue

Nakon kreiranja JNDI, kreirajte aplikaciju poslužitelja i primatelja. Morate pokrenuti poslužitelj i prijemnik na različitim konzolama. Ovdje koristimo eclipse IDE, prema zadanim postavkama otvara se u drugoj konzoli.

1) Stvorite tvornicu povezivanja i odredišni resurs

Otvorite konzolu administratora poslužitelja pomoću URL-a http://localhost:4848

Prijavite se korisničkim imenom i lozinkom.

Klikni na JMS Resurs -> Connection Factories -> Novo , sada napišite ime skupa i odaberite vrstu resursa kao QueueConnectionFactory, a zatim kliknite na gumb OK.

Klikni na Resurs JMS -> Resursi odredišta -> Novo , sada napišite JNDI naziv i naziv fizičkog odredišta, a zatim kliknite na gumb OK.

2) Stvorite aplikaciju pošiljatelja i primatelja

Pogledajmo kod pošiljatelja i primatelja. Imajte na umu da je primatelj priložen slušatelju koji će biti pozvan kada korisnik pošalje poruku.

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

Prvo pokrenite klasu primatelja, a zatim klasu pošiljatelja.


Primjer JMS teme

To je isto kao JMS Queue, ali morate promijeniti Queue u Topic, Sender u Publisher i Receiver u Subscriber.

Morate kreirati 2 JNDI named myTopicConnectionFactory i 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);} } }