JMS (служба повідомлень Java) — це API, який надає можливість створювати, надсилати та читати повідомлення. Він забезпечує слабко зв'язаний, надійний і асинхронний зв'язок.
1 мільйон скільки 0
JMS також відомий як служба обміну повідомленнями.
Розуміння обміну повідомленнями
Обмін повідомленнями – це техніка для обміну даними програм або програмних компонентів.
JMS в основному використовується для надсилання та отримання повідомлень від однієї програми до іншої.
Вимоги JMS
Зазвичай користувач надсилає повідомлення програмі. Але, якщо ми хочемо надіслати повідомлення з однієї програми в іншу, нам потрібно використовувати JMS API.
Розглянемо сценарій, коли одна програма A працює в ІНДІЇ, а інша програма B працює в США. Щоб надіслати повідомлення від програми A до B, нам потрібно використовувати JMS.
Перевага JMS
1) Асинхронний: Щоб отримати повідомлення, клієнту не потрібно надсилати запит. Повідомлення надійде до клієнта автоматично.
2) Надійний: Це гарантує доставку повідомлення.
Домени обміну повідомленнями
У JMS є два типи доменів обміну повідомленнями.
- Домен обміну повідомленнями «точка-точка».
- Домен обміну повідомленнями видавця/передплатника
1) Домен обміну повідомленнями «точка-точка» (PTP).
У моделі PTP є одне повідомлення доставлено одному отримувачу тільки. тут, Черга використовується як проміжне програмне забезпечення, орієнтоване на повідомлення (MOM).
Черга відповідає за утримання повідомлення, доки одержувач не буде готовий.
У моделі PTP є немає залежності від часу між відправником і одержувачем.
2) Домен обміну повідомленнями видавця/передплатника (Pub/Sub).
У моделі Pub/Sub є одне повідомлення доставлено всім абонентам . Це як трансляція. тут, Тема використовується як проміжне програмне забезпечення, орієнтоване на повідомлення, яке відповідає за зберігання та доставку повідомлень.
У моделі PTP є залежність від часу між видавцем і передплатником.
Модель програмування JMS
Приклад черги JMS
Щоб розробити приклад черги JMS, вам потрібно встановити будь-який сервер додатків. Ось ми використовуємо скляна риба3 сервер, де ми створюємо два JNDI.
- Створити фабрику підключень під назвою myQueueConnectionFactory
- Створити цільовий ресурс під назвою myQueue
Після створення JNDI створіть програму сервера та приймача. Вам потрібно запустити сервер і приймач на різних консолях. Тут ми використовуємо eclipse IDE, вона за замовчуванням відкривається в іншій консолі.
1) Створіть фабрику підключень і цільовий ресурс
Відкрийте консоль адміністратора сервера за URL-адресою http://localhost:4848
Увійдіть за допомогою імені користувача та пароля.
Натисніть на Ресурс JMS -> Фабрики з'єднань -> Нове , тепер напишіть назву пулу та виберіть тип ресурсу як QueueConnectionFactory, а потім натисніть кнопку OK.
Натисніть на Ресурс JMS -> Ресурси призначення -> Новий , тепер введіть ім’я JNDI та ім’я фізичного призначення, а потім натисніть кнопку OK.
2) Створіть програму відправника та отримувача
Давайте подивимося код відправника та одержувача. Зауважте, що Receiver приєднаний із слухачем, який буде викликано, коли користувач надсилає повідомлення.
Файл: 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);} } }Файл: 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.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);} } }Файл: 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);} } }