logo

Підручник JMS

JMS (служба повідомлень Java) — це API, який надає можливість створювати, надсилати та читати повідомлення. Він забезпечує слабко зв'язаний, надійний і асинхронний зв'язок.

1 мільйон скільки 0

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