JMS (Java Message Service) er et API som gir mulighet for å opprette, sende og lese meldinger. Det gir løst koblet, pålitelig og asynkron kommunikasjon.
git push-kommando
JMS er også kjent som en meldingstjeneste.
Forstå meldinger
Meldinger er en teknikk for å kommunisere applikasjoner eller programvarekomponenter.
JMS brukes hovedsakelig til å sende og motta meldinger fra en applikasjon til en annen.
Krav til JMS
Vanligvis sender brukeren melding til applikasjonen. Men hvis vi ønsker å sende meldinger fra en applikasjon til en annen, må vi bruke JMS API.
Tenk på et scenario, en applikasjon A kjører i INDIA og en annen applikasjon B kjører i USA. For å sende melding fra A-applikasjon til B, må vi bruke JMS.
Fordel med JMS
1) Asynkron: For å motta meldingen trenger ikke klienten å sende forespørselen. Meldingen kommer automatisk til klienten.
2) Pålitelig: Det gir sikkerhet for at meldingen blir levert.
Meldingsdomener
Det er to typer meldingsdomener i JMS.
- Punkt-til-punkt meldingsdomene
- Utgiver-/abonnentmeldingsdomene
1) Punkt-til-punkt (PTP) meldingsdomene
I PTP-modellen er en melding levert til én mottaker bare. Her, Kø brukes som en meldingsorientert mellomvare (MOM).
Køen er ansvarlig for å holde meldingen til mottakeren er klar.
I PTP-modellen er det ingen tidsavhengighet mellom avsender og mottaker.
2) Utgiver/abonnent (Pub/Sub) meldingsdomene
I Pub/Sub-modellen er en melding levert til alle abonnenter . Det er som å kringkaste. Her, Emne brukes som en meldingsorientert mellomvare som er ansvarlig for å holde og levere meldinger.
I PTP-modellen er det tidsavhengighet mellom utgiver og abonnent.
JMS programmeringsmodell
Eksempel på JMS-kø
For å utvikle JMS-køeksempel, må du installere en hvilken som helst applikasjonsserver. Her bruker vi glassfish3 server hvor vi lager to JNDI.
- Opprett tilkobling fabrikken navngitt myQueueConnectionFactory
- Opprett destinasjonsressurs med navn min kø
Etter å ha opprettet JNDI, lag server- og mottakerapplikasjon. Du må kjøre server og mottaker i en annen konsoll. Her bruker vi eclipse IDE, den åpnes i en annen konsoll som standard.
1) Opprett tilkoblingsfabrikk og destinasjonsressurs
Åpne serveradministrasjonskonsollen ved hjelp av URL-en http://localhost:4848
Logg inn med brukernavn og passord.
Klikk på JMS Ressurs -> Tilkoblingsfabrikker -> Ny , skriv nå bassengnavnet og velg ressurstype som QueueConnectionFactory og klikk deretter på ok-knappen.
Klikk på JMS-ressurs -> Destinasjonsressurser -> Ny , skriv nå JNDI-navnet og det fysiske destinasjonsnavnet og klikk deretter på ok-knappen.
2) Opprett avsender- og mottakerapplikasjon
La oss se avsender- og mottakerkoden. Merk at mottakeren er knyttet til lytteren som vil bli påkalt når brukeren sender melding.
Fil: 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);} } }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);} } }
Kjør Mottaker-klassen først og deretter Sender-klassen.
JMS-emneeksempel
Det er det samme som JMS Queue, men du må endre kø til emne, avsender til utgiver og mottaker til abonnent.
Du må opprette 2 navngitte JNDI myTopicConnectionFactory og mitt emne .
Fil: 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);} } }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);} } }