1. التواصل غير المتزامن
إن RMI و Hessian وغيرها من التقنيات التي تواصلنا معها من قبل هي آليات اتصال متزامنة. عندما يقوم العميل باستدعاء طريقة عن بُعد ، يجب على العميل الانتظار حتى يتم الانتهاء من الطريقة عن بُعد قبل الاستمرار في التنفيذ. سيتم حظر العميل خلال هذه الفترة (هذا يسبب تجربة مستخدم سيئة للغاية).
(اتصال متزامن)
التواصل المتزامن ليس الطريقة الوحيدة للتفاعل بين البرامج. في آلية الاتصال غير المتزامنة ، لا يحتاج العميل إلى انتظار الخدمة لمعالجة الرسالة ، ويمكنه الاستمرار في تنفيذ الرسالة وتلقيها أخيرًا ومعالجتها.
(التواصل غير المتزامن)
مزايا التواصل غير المتزامن
لا حاجة للانتظار. يحتاج العميل فقط إلى إرسال الرسالة إلى وسيط الرسائل ، ويمكنه الاستمرار في أداء المهام الأخرى دون انتظار ، ومن المؤكد أنه سيتم تسليم الرسالة إلى الوجهة المقابلة.
الموجهة إلى الرسائل وتفكك. لا داعي للقلق بشأن مواصفات واجهة الخدمة عن بُعد ، فهو يحتاج فقط إلى وضع الرسالة في قائمة انتظار الرسائل والحصول على النتائج.
2. JMS
1. مقدمة
قبل ظهور JMS ، كان لكل وسيط رسالة تنفيذ مختلف ، مما جعل رمز الرسالة بين الوسطاء المختلفين يصعب أن يكونوا عالميين. JMS (خدمة رسائل Java) هي معيار يحدد واجهة برمجة تطبيقات شائعة تستخدم وسطاء الرسائل. أي أن جميع التطبيقات التي تمتثل للمواصفات تستخدم واجهة مشتركة ، على غرار JDBC توفر واجهة مشتركة لعمليات قاعدة البيانات.
عدة عناصر مهمة من JMS:
الوجهة: القناة التي يتم إرسال الرسالة إليها من المرسل.
ConnectionFactory: مصنع اتصال ، يستخدم لإنشاء كائنات متصلة.
الاتصال: واجهة الاتصال ، تستخدم لإنشاء جلسة.
الجلسة: واجهة الجلسة ، المستخدمة لإنشاء المرسل ، وتلقي الرسالة ، وكائن الرسالة نفسه.
Messageconsumer: مستهلك الرسالة.
MessageProducer: منتج الرسالة.
xxxmessage: أنواع مختلفة من كائنات الرسائل ، بما في ذلك 5 أنواع: bytemessage ، mapmessage ، ObjectMessage ، StreamMessage و TextMessage.
2. نموذج رسالة JMS
أنظمة الرسائل المختلفة لها نماذج رسائل مختلفة. يوفر JMS نموذجين: قائمة الانتظار (نقطة إلى نقطة) والموضوع (النشر/الاشتراك).
نموذج قائمة انتظار JMS (نقطة إلى نقطة)
في نموذج نظير إلى نظير ، ينتج منتج الرسائل رسالة ويرسلها إلى قائمة الانتظار ، ثم يأخذها مستهلك الرسالة من قائمة الانتظار ويستهلك الرسالة ، ولكن لا يمكن استهلاكه بشكل متكرر.
كما هو موضح في الصورة:
المرسل 1 ، المرسل 2 ، والمرسل 3 يرسل كل رسالة إلى الخادم ؛
ستشكل الرسائل 1 و 2 و 3 قائمة انتظار بالترتيب ، ولا تعرف الرسائل الموجودة في قائمة الانتظار أي المستلم سيستهلكه ؛
أجهزة الاستقبال 1 و 2 و 3 على التوالي تجلب رسالة من قائمة الانتظار للاستهلاك. في كل مرة يتم فيها إحضار رسالة ، ستحذف قائمة الانتظار الرسالة ، مما يضمن عدم استهلاك الرسالة بشكل متكرر.
أصبح نموذج قائمة انتظار JMS أيضًا نموذجًا P2P (نقطة إلى نقطة).
نموذج JMS (النشر/الاشتراك) نموذج
يكمن الفرق الأكبر بين نموذج موضوع JMS ونموذج قائمة انتظار JMS في جزء من الرسالة التي تلقيها. يشبه نموذج الموضوع حساب WeChat الرسمي. يمكن للمستلمين الذين يشتركون في الحساب الرسمي تلقي الرسائل التي يدفعها الحساب الرسمي.
كما هو موضح في الصورة:
الناشرين 1 ، 2 ، 3 نشر 3 موضوعات 1 ، 2 ، 3 على التوالي ؛
وبهذه الطريقة ، يمكن لمجموعة المستخدمين التي تشترك في الموضوع 1: يمكن للمشتركين 1 ، 2 ، 3 تلقي رسائل الموضوع 1 ؛ وبالمثل ، يمكن للمشتركين 4 ، 5 ، 6 استلام رسائل الموضوع 2 ، ويمكن للمشتركين 7 و 8 و 9 أن يتلقى الموضوع 3 رسائل.
أصبح نموذج موضوع JMS أيضًا النموذج PUS/SUB.
مقارنة كل عنصر في الوضعين:
3. نموذج برمجة JMS التقليدي
منتج:
(1) إنشاء اتصال مصنع الاتصال ؛
(2) إنشاء اتصال باستخدام مصنع الاتصال ؛
(3) بدء الاتصال ؛
(4) إنشاء جلسة ؛
(5) إنشاء وجهة لإرسال الرسائل ؛
(6) إنشاء منتج ؛
(7) إنشاء نوع الرسالة ومحتوى الرسالة ؛
(8) إرسال رسالة ؛
مستهلك:
(1) إنشاء اتصال مصنع الاتصال ؛
(2) إنشاء اتصال باستخدام مصنع الاتصال ؛
(3) بدء الاتصال ؛
(4) إنشاء جلسة ؛
(5) إنشاء وجهة لإرسال الرسائل ؛
(6) إنشاء مستهلك (7) إنشاء نوع رسالة ؛
(8) تلقي الرسائل ؛
3. مقدمة إلى ActiveMq
ActiveMQ هو ناقل رسالة مفتوح المصدر الأكثر شعبية وقوية من إنتاج Apache. ActiveMQ هو تطبيق مزود JMS يدعم تمامًا مواصفات JMS1.1 و J2EE 1.4. على الرغم من أن مواصفات JMS قد تم تقديمها لفترة طويلة ، إلا أن JMS لا تزال تلعب موقعًا خاصًا بين تطبيقات J2EE اليوم.
الميزات الرئيسية ActiveMQ:
كتابة العملاء بلغات وبروتوكولات متعددة. اللغات: Java ، C ، C ++ ، C#، Ruby ، Perl ، Python ، PHP. بروتوكول التطبيق:
OpenWire ، Stomp Rest ، WS Atification ، XMPP ، AMQP
دعم كامل لمواصفات JMS1.1 و J2EE 1.4 (الثبات ، رسائل XA ، المعاملات)
لدعم الربيع ، يمكن دمج ActiveMQ بسهولة في النظام باستخدام الربيع ، كما يدعم ميزات Spring 2.0. اجتاز اختبار خوادم J2EE المشتركة (مثل Geronimo ، Jboss 4 ، Glassfish ، Weblogic). من خلال تكوين محولات الموارد JCA 1.5 ، يمكن نشر ActiveMQ تلقائيًا في أي خادم تجاري متوافق J2EE 1.4 ويدعم بروتوكولات نقل متعددة: In-VM ، TCP ، SSL ، NIO ، UDP ، JGROUPS ، JXTA
يدعم استمرار الرسائل عالية السرعة من خلال JDBC و Journal ، والتي تضمن مجموعات عالية الأداء ، وخدم العميل ، ودعم نقطة إلى نقطة لـ Ajax
تكامل الدعم مع Axis للاتصال بسهولة بمزود JMS المدمج للاختبار
4. ActiveMQ القتال الفعلي
دعنا نلقي نظرة على كيفية تنفيذ ActiveMQ لقائمة انتظار بسيطة.
نموذج برمجة JMS التقليدية
1. تنفيذ رمز نموذج قائمة انتظار JMS:
منتج:
package com.wgs.mq.queue ؛ import org.apache.activemq.activemqconnectionfactory ؛ import javax.jms.* ؛/*** تم إنشاؤه بواسطة genshenwang.nomico في 2017/10/19. */الفئة العامة ActiveMqProducer {url url url final static private = "tcp: // localhost: 61616" ؛ Queue_Name static queue_name static static = "قائمة الانتظار" ؛ ActiveMqConnectionFactory (url) ؛ // 2 قم بإنشاء اتصال باستخدام اتصال مصنع الاتصال = connectionFactory.CreateConnection () ؛ // 3 ابدأ الاتصال بالاتصال. Producer MessageProducer MessageProducer = Session.CreateProducer (الوجهة) ؛ // 7 إنشاء رسالة نص textMessage = session.createTextMessage () ؛ لـ (int i = 1 ؛ i <= 100 ؛ i ++) {// 8 إنشاء محتوى رسالة textMessage.settext ("Sender- 1 -send message:"+i) ؛ // send message messageproducer.sendCONUSMER:
package com.wgs.mq.queue ؛ import org.apache.activemq.activemqconnectionfactory ؛ import javax.jms.* ؛/*** تم إنشاؤه بواسطة genshenwang.nomico في 2017/10/19. */الفئة العامة ActiveMqConsumer {url url url static static {private static url = "tcp: // localhost: 61616" ؛ Queue_name Queue_name static static static = "قائمة الانتظار" ؛ ActiveMqConnectionFactory (url) ؛ // 2 قم بإنشاء اتصال باستخدام اتصال مصنع الاتصال = connectionFactory.CreateConnection () ؛ // 3 ابدأ الاتصال بالاتصال. المستهلك messageconsumer messageconsumer = session.createconsumer (الوجهة) ؛ messageconsumer.setMessageListener (new messagelistener () {public void onMessage (رسالة رسالة) {// 7 إنشاء رسالة textMessage textMessage = (textMessage) رسالة ؛ جرب {// 7 استلام message.out.println ("المستهلك - 1 - استلام رسالة: {E.PrintStackTrace () ؛}}}) ؛}}2. JMS Topic Model Code Applease:
منتج:
package com.wgs.mq.topic ؛ import org.apache.activemq.activemqConnectionFactory ؛ import javax.jms.* ؛/*** publish mode* mode by Genshenwang.nomico في 2017/10/19. */الفئة العامة ActiveMqProducer {private Static Final String url = "tcp: // localhost: 61616" ؛ private static final string topic_name = "topic-name" ؛ public static void main (string [] args) jmsexception {// 1 connectory connectionfactoryconnector قم بإنشاء اتصال باستخدام اتصال مصنع اتصال Connection = connectionfactory.createConnection () ؛ // 3 ابدأ الاتصال. Session.CreateProducer (الوجهة) ؛ // 7 قم بإنشاء رسالة TextMessage TextMessage = session.createTextMessage () ؛ لـ (int i = 1 ؛ i <= 100 ؛ i ++) {// 8 إنشاء محتوى رسالة textMessage.settext ("Sender- 1 -send message:"+i) ؛ // send message messageproducer.sendمستهلك:
package com.wgs.mq.topic ؛ import org.apache.activemq.activemqconnectionfactory ؛ import javax.jms.* ؛/*** publish mode* mode* تم إنشاؤه بواسطة genshenwang.nomico في 2017/10/19. */الفئة العامة ActiveMqConsumer {url url static final static private = "tcp: // localhost: 61616" ؛ private static final string topic_name = "Topic-Name" ؛ قم بإنشاء اتصال باستخدام اتصال مصنع اتصال = connectionfactory.createConnection () ؛ // 3 ابدأ الاتصال. Session.CreateConsumer (الوجهة) ؛ messageconsumer.setMessageListener (new messagelistener () {public void onMessage (رسالة رسالة) {// 7 إنشاء رسالة textMessage textMessage = (textMessage) {E.PrintStackTrace () ؛}}}) ؛}}قوالب JMS باستخدام الربيع
على الرغم من أن JMS يوفر واجهة موحدة لجميع وسطاء الرسائل ، مثل JDBC ، يمكن أن يبدو معقدًا عند التعامل مع الاتصالات والبيانات ومجموعات النتائج والاستثناءات. ومع ذلك ، يوفر لنا Spring jmstemplate للقضاء على رمز JMS المتكرر والمكرر.
دعنا نلقي نظرة على كيفية استخدام jmstemplate لتنفيذ قوائم قوائم الرسائل.
1. تنفيذ رمز نموذج قائمة انتظار JMS:
ملف التكوين:
producer.xml:
<؟ xmlns: context = "http://www.springframework.org/schema/context" http://www.springframework.org/schema/Context name = "brokerurl" value = "tcp: // localhost: 61616"/> </bean> <!-قم بتكوين مصنع اتصال JMS في فصل الربيع للاتصال بالاتصالات التي توفرها ActiveMq-> <bean id = "connectionfactory"> property name = "targetConnectionFactory" ref = targetconnection "/> <bean id = "jmstemplate"> <property name = "connectionfactory" ref = "connectionFactory"/> </bean> <!-تكوين اسم وجهة قائمة الانتظار-> <bean id = "queuedestination"> <constructor-arg value = "queue-spring-name"/> </bean> value = "topic-spring-name"/> </bean> <bean id = "producerserviceimpl"/> </bans>
المستهلك. xml:
<؟ xmlns: context = "http://www.springframework.org/schema/context" http://www.springframework.org/schema/Context name = "brokerurl" value = "tcp: // localhost: 61616"/> </bean> <!-قم بتكوين مصنع اتصال JMS في فصل الربيع للاتصال بالاتصالات التي توفرها ActiveMq-> <bean id = "connectionFactory"> properن id = "queuedeStination"> <value-arg constructor-arg = "قائمة الانتظار-spring-name"/> </bean> <!-قم بتكوين مستمع الرسائل-> <bean id = "consumermessagelistener"/> <! ref = "connectionfactory"/> <property name = "messagelistener" ref = "consumerMessageListener"/> </bean> <!-تكوين اسم قائمة الانتظار-> <bean id = "topicdestination"> <constructor-arg value = "spring-name"/> </bean>
منتج:
(1) اكتب واجهة أولاً:
حزمة com.wgs.jms.producer ؛/*** تم إنشاؤها بواسطة Genshenwang.nomico في 2017/10/20. */الواجهة العامة ActiveMqProducerservice {void sendMessage (رسالة السلسلة النهائية) ؛}(2) تنفيذ الواجهة:
package com.wgs.jms.producer ؛ استيراد org.springframework.beans.factory.annotation. تم إنشاؤها بواسطة Genshenwang.nomico في 2017/10/20. */الفئة العامة activeMqProducerserviceImpl تنفذ ActiveMqProducerservice {autowired jmstemplate jmstemplate ؛@resource (name = "queuedeStination" الوجهة العامة ؛ {textMessage textMessage = session.createTextMessage (message) ؛ return textMessage ؛}}) ؛ system.out.println ("Producer- 1 -send message بنجاح:" + رسالة) ؛}}(3) الاختبار:
package com.wgs.jms.producer ؛ استيراد org.springframework.context.support.classpathxmlicationContext ؛/*** تم إنشاؤه بواسطة genshenwang.nomico في 2017/10/20. */الفئة العامة activeMqProducermain {public static void main (string [] args) {classPathxMlicPlicationContext context = new classPathxMlapPlicationContext ("producer.xml") ؛ {service.sendMessage ("Test" + I) ؛} context.close () ؛}} مستهلك:
(1) إنشاء مستمع رسالة:
package com.wgs.jms.consumer ؛ استيراد javax.jms.jmsexception ؛ استيراد javax.jms.message ؛ استيراد javax.jms.messagelistener ؛ استيراد javax.jms.textMessage ؛/*** تم إنشاؤه بواسطة genshenwang.nomico في 2017/10/20. */الفئة العامة المستهلك extreeageListener تنفذ messagelistener {public void onMessage (رسالة رسالة) {try {textMessage textMessage = (textMessage) message ؛ system.out.println ("e) e.printSticTrate ((2) الاختبار:
package com.wgs.jms.consumer ؛ استيراد org.springframework.context.support.classpathxmlicationContext ؛/*** تم إنشاؤه بواسطة genshenwang.nomico في 2017/10/20. */فئة عامة activeMqConsumerMain {public static void main (string [] args) {classPathxMlicationContext context = new ClassPathxMlapPlicationContext ("consumer.xml") ؛}}2. JMS Topic Model Code Applease:
ما عليك سوى تغيير قائمة الانتظار التي تظهر في الكود أعلاه إلى TopicDestination.
لخص
ما سبق هو كل محتوى هذه المقالة حول إدخال JMS ورمز ActiveMQ الفعلي. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!