logo

הדרכה של JMS

JMS (Java Message Service) הוא API המספק את המתקן ליצור, לשלוח ולקרוא הודעות. הוא מספק תקשורת משולבת רופפת, אמינה וא-סינכרונית.

Java while condition

JMS ידוע גם כשירות הודעות.


הבנת העברת הודעות

העברת הודעות היא טכניקה לתקשורת יישומים או רכיבי תוכנה.

JMS משמש בעיקר כדי לשלוח ולקבל הודעות מאפליקציה אחת לאחרת.


דרישת JMS

בדרך כלל, המשתמש שולח הודעה לאפליקציה. אבל, אם אנחנו רוצים לשלוח הודעה מאפליקציה אחת לאחרת, אנחנו צריכים להשתמש ב-JMS API.

שקול תרחיש, יישום אחד A פועל בהודו ויישום אחר B פועל בארה'ב. כדי לשלוח הודעה מאפליקציה A ל-B, עלינו להשתמש ב-JMS.


יתרון של JMS

1) אסינכרוני: כדי לקבל את ההודעה, הלקוח אינו נדרש לשלוח בקשה. ההודעה תגיע אוטומטית ללקוח.

2) אָמִין: זה מספק ביטחון שההודעה נמסרת.


דומיינים להעברת הודעות

ישנם שני סוגים של דומיינים להעברת הודעות ב-JMS.

  1. דומיין הודעות נקודה לנקודה
  2. תחום העברת הודעות של מוציא לאור/מנוי

1) דומיין הודעות נקודה לנקודה (PTP).

במודל PTP, הודעה אחת היא נמסר למקלט אחד רק. כאן, תוֹר משמש כתווך מונחה הודעות (MOM).

התור אחראי להחזיק את ההודעה עד שהמקלט יהיה מוכן.

במודל PTP, יש ללא תלות בתזמון בין השולח למקבל.


2) דומיין הודעות מפרסם/מנוי (פאב/משנה).

במודל Pub/Sub, הודעה אחת היא נמסר לכל המנויים . זה כמו שידור. כאן, נוֹשֵׂא משמש כתווך מונחה הודעות שאחראי להחזיק ולמסור הודעות.

במודל PTP, יש תלות בתזמון בין מפרסם למנוי.



מודל תכנות JMS


דוגמה לתור JMS

כדי לפתח דוגמה לתור JMS, עליך להתקין כל שרת יישומים. הנה, אנחנו משתמשים דג זכוכית 3 שרת שבו אנו יוצרים שני JNDI.

  1. צור מפעל חיבור בשם myQueueConnectionFactory
  2. צור משאב יעד בשם התור שלי

לאחר יצירת JNDI, צור אפליקציית שרת ומקלט. אתה צריך להפעיל שרת ומקלט בקונסולה אחרת. כאן, אנו משתמשים ב-eclipse IDE, הוא נפתח בקונסולה אחרת כברירת מחדל.

1) צור מפעל חיבור ומשאב יעד

פתח את מסוף הניהול של השרת לפי כתובת האתר http://localhost:4848

התחבר עם שם המשתמש והסיסמה.

הקלק על ה משאב JMS -> מפעלי חיבור -> חדש , כתוב כעת את שם המאגר ובחר את סוג המשאב בתור QueueConnectionFactory ואז לחץ על כפתור אישור.

הקלק על ה משאב JMS -> משאבי יעד -> חדש , כתוב כעת את שם JNDI ושם היעד הפיזי ולאחר מכן לחץ על כפתור אישור.

2) צור יישום שולח ומקבל

בוא נראה את קוד השולח והמקבל. שימו לב שהמקלט מחובר למאזין שיופעל כאשר המשתמש ישלח הודעה.

קובץ: 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);} } } 

הפעל תחילה את מחלקת המקלט ולאחר מכן את מחלקת השולח.


דוגמה לנושא JMS

זה זהה לתור JMS, אבל אתה צריך לשנות את התור לנושא, את השולח למפרסם ואת המקבל למנוי.

אתה צריך ליצור 2 JNDI בשם myTopicConnectionFactory ו הנושא שלי .

קובץ: 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);} } }