logo

JMS handledning

JMS (Java Message Service) är ett API som ger möjlighet att skapa, skicka och läsa meddelanden. Det ger löst kopplad, pålitlig och asynkron kommunikation.

odefinierad lutning

JMS är också känd som en meddelandetjänst.


Förstå meddelandehantering

Meddelanden är en teknik för att kommunicera applikationer eller programvarukomponenter.

JMS används främst för att skicka och ta emot meddelanden från en applikation till en annan.


Krav på JMS

I allmänhet skickar användaren meddelande till applikationen. Men om vi vill skicka meddelanden från en applikation till en annan måste vi använda JMS API.

Tänk på ett scenario, en applikation A körs i INDIEN och en annan applikation B körs i USA. För att skicka meddelande från A-applikation till B måste vi använda JMS.


Fördel med JMS

1) Asynkron: För att ta emot meddelandet behöver klienten inte skicka förfrågan. Meddelandet kommer automatiskt till klienten.

2) Pålitlig: Det ger en garanti för att meddelandet levereras.


Meddelandedomäner

Det finns två typer av meddelandedomäner i JMS.

  1. Punkt-till-punkt-meddelandedomän
  2. Utgivare/prenumerantmeddelandedomän

1) Punkt-till-punkt (PTP) meddelandedomän

I PTP-modellen är ett meddelande levereras till en mottagare endast. Här, används som en meddelandeorienterad mellanvara (MOM).

Kön ansvarar för att hålla meddelandet tills mottagaren är redo.

I PTP-modellen finns det inget timingberoende mellan avsändare och mottagare.


2) Utgivare/prenumerant (Pub/Sub) meddelandedomän

I Pub/Sub-modellen är ett meddelande levereras till alla prenumeranter . Det är som att sända. Här, Ämne används som ett meddelandeorienterat mellanprogram som ansvarar för att hålla och leverera meddelanden.

I PTP-modellen finns det timingberoende mellan utgivare och prenumerant.



JMS programmeringsmodell


JMS-köexempel

För att utveckla JMS-köexempel måste du installera valfri applikationsserver. Här använder vi glasfisk3 server där vi skapar två JNDI.

  1. Skapa anslutning fabriken heter myQueueConnectionFactory
  2. Skapa destinationsresurs med namnet minQueue

Efter att ha skapat JNDI, skapa server- och mottagarapplikation. Du måste köra server och mottagare i olika konsoler. Här använder vi eclipse IDE, den öppnas i en annan konsol som standard.

1) Skapa anslutningsfabrik och destinationsresurs

Öppna serverns administratörskonsol med URL:en http://localhost:4848

Logga in med användarnamn och lösenord.

Klicka på JMS Resurs -> Anslutningsfabriker -> Nytt , skriv nu poolnamnet och välj resurstyp som QueueConnectionFactory och klicka sedan på ok-knappen.

Klicka på JMS Resurs -> Destinationsresurser -> Nytt , skriv nu JNDI-namnet och det fysiska destinationsnamnet och klicka sedan på OK-knappen.

2) Skapa avsändare och mottagare

Låt oss se avsändar- och mottagarens kod. Observera att mottagaren är kopplad till en lyssnare som kommer att anropas när användaren skickar meddelande.

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

Kör klassen Mottagare först och sedan Sender-klassen.


JMS ämnesexempel

Det är samma som JMS Queue, men du måste ändra kö till ämne, avsändare till utgivare och mottagare till prenumerant.

Du måste skapa 2 namngivna JNDI myTopicConnectionFactory och mitt ämne .

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