logo

JMS урок

JMS (Java Message Service) е API, който предоставя възможност за създаване, изпращане и четене на съобщения. Той осигурява слабо свързана, надеждна и асинхронна комуникация.

java точка

JMS е известен също като услуга за съобщения.


Разбиране на съобщенията

Съобщенията са техника за комуникация на приложения или софтуерни компоненти.

JMS се използва главно за изпращане и получаване на съобщения от едно приложение към друго.


Изискване на JMS

Обикновено потребителят изпраща съобщение до приложението. Но ако искаме да изпратим съобщение от едно приложение към друго, трябва да използваме JMS API.

Помислете за сценарий, едно приложение A работи в ИНДИЯ, а друго приложение B работи в САЩ. За да изпратим съобщение от приложение A до B, трябва да използваме JMS.


Предимство на JMS

1) Асинхронен: За да получи съобщението, клиентът не е длъжен да изпраща заявка. Съобщението ще пристигне автоматично до клиента.

2) Надежден: Той осигурява увереност, че съобщението е доставено.


Домейни за съобщения

Има два типа домейни за съобщения в JMS.

  1. Домейн за съобщения от точка до точка
  2. Домейн за съобщения на издател/абонат

1) Домейн за съобщения от точка до точка (PTP).

В PTP модела е едно съобщение доставени на един получател само. Тук, Опашка се използва като ориентиран към съобщения мидълуер (MOM).

Опашката е отговорна за задържането на съобщението, докато получателят е готов.

В PTP модела има няма зависимост от времето между подател и получател.


2) Домейн за съобщения на издател/абонат (Pub/Sub).

В модела Pub/Sub едно съобщение е доставени на всички абонати . Това е като излъчване. Тук, Тема се използва като ориентиран към съобщения междинен софтуер, който отговаря за задържането и доставянето на съобщения.

В PTP модела има зависимост от времето между издател и абонат.



JMS модел за програмиране


Пример за JMS опашка

За да разработите пример за JMS опашка, трябва да инсталирате произволен сървър за приложения. Ето, ние използваме стъклена риба3 сървър, където създаваме два JNDI.

  1. Създайте фабрика за свързване с име myQueueConnectionFactory
  2. Създайте целеви ресурс с име myQueue

След като създадете JNDI, създайте сървърно и приемно приложение. Трябва да стартирате сървъра и приемника в различна конзола. Тук използваме eclipse IDE, тя се отваря в различна конзола по подразбиране.

1) Създайте фабрика за свързване и целеви ресурс

Отворете административната конзола на сървъра чрез URL адреса http://localhost:4848

Влезте с потребителско име и парола.

Кликнете върху JMS ресурс -> Фабрики за свързване -> Ново , сега напишете името на пула и изберете Тип ресурс като QueueConnectionFactory, след което щракнете върху бутона OK.

Кликнете върху JMS ресурс -> Ресурси за местоназначение -> Ново , сега напишете JNDI името и името на физическата дестинация, след което щракнете върху бутона OK.

2) Създайте приложение за подател и получател

Да видим кода на изпращача и получателя. Имайте предвид, че Receiver е прикачен със слушател, който ще бъде извикан, когато потребителят изпрати съобщение.

Файл: 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);} } } 
Файл: 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);} } } 
Файл: 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);} } } 

Стартирайте първо класа Receiver, след това класа Sender.


Пример за JMS тема

Това е същото като JMS Queue, но трябва да промените Queue на Topic, Sender на Publisher и Receiver на Subscriber.

Трябва да създадете 2 JNDI наименувани myTopicConnectionFactory и myTopic .

Файл: 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);} } } 
Файл: 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);} } } 
Файл: 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);} } }