logo

دروس JMS

JMS (خدمة رسائل Java) هي واجهة برمجة تطبيقات توفر إمكانية إنشاء الرسائل وإرسالها وقراءتها. إنه يوفر اتصالاً غير متزامن وموثوقًا وغير متزامن.

مجموعة من السلاسل في البرمجة C

تُعرف JMS أيضًا بخدمة المراسلة.


فهم الرسائل

المراسلة هي تقنية لتوصيل التطبيقات أو مكونات البرامج.

يستخدم JMS بشكل أساسي لإرسال واستقبال الرسائل من تطبيق إلى آخر.


متطلبات JMS

بشكل عام، يرسل المستخدم رسالة إلى التطبيق. ولكن، إذا أردنا إرسال رسالة من تطبيق إلى آخر، فنحن بحاجة إلى استخدام JMS API.

خذ بعين الاعتبار سيناريو، أحد التطبيقات A قيد التشغيل في الهند وتطبيق آخر B قيد التشغيل في الولايات المتحدة الأمريكية. لإرسال رسالة من تطبيق إلى تطبيق 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 ثم انقر فوق الزر 'موافق'.

اضغط على مورد 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);} } }