مقدمة إلى RabbitMQ
RabbitMQ هو نظام مراسلة مؤسسي كامل وقابل لإعادة الاستخدام يعتمد على AMQP
MQ هو الاسم الكامل لقائمة انتظار الرسائل. قائمة انتظار الرسائل (MQ) هي وسيلة للاتصال بين التطبيقات والتطبيقات. تتواصل التطبيقات من خلال قراءة الرسائل القائمة الانتخابية وكتابةها (بيانات للتطبيقات) دون اتصال مخصص لربطها. يشير تسليم الرسائل إلى التواصل بين البرامج عن طريق إرسال البيانات في الرسائل ، بدلاً من الاتصال مباشرة ببعضها البعض ، عادة ما يتم استخدام المكالمات المباشرة في تقنيات مثل مكالمات الإجراءات عن بُعد. يشير قائمة الانتظار إلى التطبيق الذي يتواصل من خلال قائمة انتظار. يؤدي استخدام قوائم الانتظار إلى إلغاء شرط تنفيذ تطبيق الاستلام والإرسال في وقت واحد.
AMQP هو بروتوكول ، وهو بروتوكول اتصال رسائل طبقة التجريد عالية المستوى.
على الرغم من وجود العديد من المعايير العامة في عالم الرسائل المتزامنة (مثل Cobar IIOP ، أو SOAP ، وما إلى ذلك) ، فإن هذا ليس هو الحال في معالجة الرسائل غير المتزامنة. الشركات الكبيرة فقط لديها بعض التطبيقات التجارية (مثل Microsoft's MSMQ ، و WebSphere MQ من IBM ، وما إلى ذلك). لذلك ، في يونيو 2006 ، وضعت Cisco و Redhat و Imatix وغيرها معايير عامة مشتركة لـ AMQP. بمعنى آخر ، AMQP هو بروتوكول للتواصل غير المتزامن.
سيناريوهات استخدام الأرنب
في المشروع ، يتم استخراج بعض العمليات المستهلكة للوقت التي لا تتطلب عودة فورية ومعالجتها بشكل غير متزامن. هذه المعالجة غير المتزامنة تحفظ بشكل كبير وقت استجابة طلب الخادم ، وبالتالي تحسين إنتاجية النظام. ومع ذلك ، فإن معظمهم ليس مطلوبًا فقط للعودة على الفور ، ولا يهم ما إذا كان التنفيذ ناجحًا أم لا. إذا كنت بحاجة إلى عودة فورية ، يمكنك استخدام Dubbo. يتكامل Spring Boot مع Dubbo ، يمكنك مشاهدة Spring Boot Integration Dubbox
التبعية RabbitMQ
RabbitMQ ليست حزمة جرة بسيطة (حزمة JAR توفر فقط بعض وظائف الاتصال الأساسية مع RabbitMQ نفسها). على غرار Dubbo ، يتطلب RabbitMQ أيضًا تشغيل برامج أخرى. فيما يلي البرنامج المطلوب لتشغيل RabbitMQ.
1. إرلانج
نظرًا لأن برنامج RabbitMQ نفسه تم تطويره على أساس Erlang ، إذا كنت ترغب في تشغيل RabbitMQ ، فيجب عليك أولاً اتباع Erlang
موقع إيرلانج الرسمي
عنوان تنزيل Erlang
الأرنب
RabbitMQ هو جوهر تنفيذ قوائم قوائم الرسائل
موقع RabbitMQ الرسمي
rabbitmq تحميل
تكوين rabbitmq
بعد اكتمال التثبيت ، تحتاج إلى إكمال بعض التكوين قبل استخدام RabbitMQ. يمكنك استخدام CMD مباشرة إلى دليل SBIN ضمن دليل التثبيت لـ RabbitMQ من خلال تكوين الأوامر ، أو يمكنك العثور مباشرة على موجه أوامر RabbitMQ (SBIN DIR) في قائمة START لتشغيل SBIN مباشرة إلى دليل التثبيت الخاص بـ RabbitMQ. للراحة ، قمنا أولاً بتمكين المكون الإدارة وتنفيذ الأوامر.
rabbitmq-plugins.Bat تمكين RabbitMQ_Management
هذا صحيح ، لاحظ أن هذا تحت Windows. إذا كان Linux ، فلا توجد لاحقة الخفافيش. ثم نضيف مستخدمًا ، لأن الاتصال لا يمكن أن يكون ناجحًا بدون مستخدمين في بيئة الشبكة الخارجية. قم بتنفيذ أمر ADD USER
rabbitmqctl.bat add_user springboot كلمة مرور
Springboot هو اسم المستخدم وكلمة المرور هي كلمة المرور
بعد ذلك ، من أجل راحة العرض التوضيحي ، نعطي سبرينج أذونات المسؤول لتسهيل تسجيل الدخول إلى صفحة الإدارة
RABBITMQCTL.BAT SET_USER_TAGS Springboot Administrator
إعطاء أذونات الحساب
rabbitmqctl.bat set_permissions -p / springboot.*.*.*
ثم ابدأ خدمة RabbitMQ وزيارة صفحة إدارة RabbitMQ http: // localhost: 15672 لمشاهدة صفحة تسجيل الدخول. إذا لم يتم إنشاء مستخدم ، فيمكنك استخدام الضيف والضيف لتسجيل الدخول. إذا كان هناك مستخدم تم إنشاؤه ، فاستخدم المستخدم الذي تم إنشاؤه لتسجيل الدخول. إذا كان هناك مستخدم تم إنشاؤه ، فاستخدم المستخدم الذي تم إنشاؤه لتسجيل الدخول.
إنشاء مشروع Springboot
منذ أن ذكرت بالفعل إنشاء مشروع تمهيد ربيع في المقالة السابقة عدة مرات ، لن أقول الكثير هنا
أضف التبعيات المتعلقة بـ RabbitMQ
<!-rabbitmq-> <reperency> <roupiD> org.springframework.boot </rougeid> <Stifactid> spring-boot-starter-amqp </stifactid> </redence>
هذا صحيح ، مجرد تكوين صغير ، لكنني قد لا أفهم بهذه الطريقة ، لذلك من الأفضل نشر جميع التكوينات
<project xmlns = "http://maven.apache.org/pom/4.0.0" http://maven.apache.org/xsd/maven-4.0.0.xsd "> <Dodeversion> 4.0.0 </modelversion> <roupiD> wang.raye.robbitmq </rougaging> </stifactid> demo1 </shintifactid> <name> demo1 </mame> <Url> http://maven.apache.org </url> <berties> <project.build.sourceencoding> utf-8 </project.buid.boit> <StifactId> Spring-boot-starter-parent </stifactid> <الإصدار> 1.4.0.Release </version> </parent> <تبعية> <reperence> <roupiD> Junit </rougiD> </artifactid> Junit </stifactid> <roupl> org.springframework.boot </groupId> <StifactId> Spring-boot-starter-web </shintifactid> </premited> <!-rabbitmq-> <redence> <roupiD> org.springframework.boot </groupid> </perendencies> </project>
نظرًا لعدم وجود عمليات أخرى ، يعتمد المشروع حاليًا بشكل رئيسي على وحدتين ، حذاءان واحد وأرانب واحد
إضافة فئة التكوين
Package Wang.Raye.RabbitMq.Demo1 ؛ import org.springframework.amqp.core.acknowledgemode ؛ استيراد org.springframework.amqp.core.binding ؛ استيراد org.springframework.amqp.core.binding ؛ استيراد org.springframework.amqp.core.bindingBuilder ؛ استيراد org.springframework.amqp.core.directexchange ؛ استيراد org.springframework.amqp.core.message ؛ استيراد org.springframework.amqp.core.queue ؛ استيراد org.springframework.amqp.ribbit.connection.cachingConnectionFactory ؛ استيراد org.springframework.amqp.ribbit.connection.connectionFactory ؛ استيراد org.springframework.amqp.ribbit.core.ChannelawAremessageListener ؛ استيراد org.springframework.amqp.ribbit.listener.simplemessageListenerContainer ؛ استيراد org.springframework.context.annotation.bean ؛ استيراد org.springframework.context.annotation. / ** Queue Key1*/ Static Final String RoutingKey1 = "queue_one_key1" ؛ / ** Queue Key2*/ Static Final String Final RoutingKey2 = "queue_one_key2" ؛ / *** معلومات ارتباط التكوين* return*/ bean public connectionFactory ConnectionFactory () {CachingConnectionFactory ConnectionFactory = جديد CachingConnectionFactory ("" 127.0.0.1 "، 5672) ؛ ConnectionFactory.setUserName ("Springboot") ؛ ConnectionFactory.setPassword ("كلمة المرور") ؛ ConnectionFactory.setVirtualhost ("/") ؛ ConnectionFactory.setPublisherConfirms (True) ؛ // يجب تعيين ConnectionFactory ؛ } / *** تكوين مفتاح الرسائل* تكوين FanoutExchange للمستهلكين: توزيع الرسائل على جميع قوائم الانتظار المربوطة ، دون مفهوم RoutingKey HeadersExchange: Match DirectExchange عن طريق إضافة قيمة مفتاح السمة: توزيع على Queue المحدد ، وفقًا لـ RoutingKey TopicSchange: Multi-key matching* / bean public definive. } / ** * تكوين قائمة انتظار الرسائل 1 * تكوين للمستهلكين * regurn * / @Bean Public Queue () {return new Queue ("queue_one" ، true) ؛ // Quantity Printivent}/*** Queue Message Queue 1 مع التبديل* تكوين للمستهلكين* regurn*/ @Bean public binding () {return bindingbuilder.bind (queue ()). } / ** * تكوين قائمة انتظار الرسائل 2 * تكوين للمستهلكين * regurn * / @bean public queue1 () {return new Queue ("queue_one1" ، true) ؛ // prosistence Quick}/*** Queue Message 2 مع التبديل* تكوين للمستهلكين* regurn*/ @Bean public binding1 () {return bindingbuilder.bind (queue1 ()). إلى (defaultExchange ()). } / *** قبول الاستماع للرسالة ، سيقبل هذا المستمع الرسالة من قائمة انتظار الرسائل 1* تكوين للمستهلكين* return* / bean public SimpleMessageListenerContainer messageContainer () {simplemessagelistenercontainer container = new SimpleMessAgelistenEcontainer (connectionfactory () ؛ container.setqueues (queue ()) ؛ Container.setExposelistenerChannel (true) ؛ Container.setMaxConcurrentConsumers (1) ؛ Container.setConcurrentConsumers (1) ؛ container.setackNowledGemode (الاعتراف gemod.manual) ؛ // تعيين وضع التأكيد يدويًا تأكيد حاوية. channel.basicack (message.getMessageProperties (). getDeliveryTag () ، false) ؛ إرجاع حاوية ؛ } / *** قبول الاستماع للرسالة ، سيقبل هذا المستمع الرسالة من قائمة انتظار الرسائل 1* التكوين للمستهلكين* regurn* / bean public SimpleMessageListenerContainer messageContainer2 () {simplemessagelistenercontainer container = new SimplemessAgelistenEcontainer (connectionFactory () ؛ container.setqueues (queue1 ()) ؛ Container.setExposelistenerChannel (true) ؛ Container.setMaxConcurrentConsumers (1) ؛ Container.setConcurrentConsumers (1) ؛ container.setackNowledGemode (الاعتراف gemod.manual) ؛ // قم بتعيين وضع التأكيد يدويًا تأكيد حاوية. channel.basicack (message.getMessageProperties (). getDeliveryTag () ، false) ؛ إرجاع حاوية ؛ }}لاحظ أنه من أجل توضيح كيفية التكوين بشكل أفضل ، قمت بتكوين قوائم انتظار رسائل. باستثناء ما يتم تكوين تكوين الارتباط ، يتم استهداف بقية هذه الفئة لمستهلكي الرسائل. بالطبع ، يحتاج كل من مستهلكي الرسائل ومنتجي الرسائل إلى تكوين معلومات الارتباط. للراحة ، فإن مستهلكي الرسائل والمنتجين في هذا المشروع كلاهما في هذا المشروع. بشكل عام ، لن يكون المشروع الفعلي في نفس المشروع. نظرًا لأن التعليقات مفصلة للغاية ، فلن أقول الكثير.
أرسل رسالة
من أجل تسهيل إرسال الرسائل ، كتبت جهاز تحكم مباشرة للاتصال بطريقة إرسال الرسائل عن طريق الوصول إلى الواجهة. بدون مزيد من اللغط ، يرجى إضافة الرمز
package wang.raye.rabbitmq.demo1 ؛ import java.util.uuid ؛ استيراد org.springframework.amqp.rabbit.core.RabbitTemplate ؛ استيراد org.springframework.amqp.ribbit.support.correlationData ؛ استيراد org.springframework.web.bind.annotation.requestmapping ؛ استيراد org.springframework.web.bind.annotation.restController ؛/** * اختبر وحدة التحكم لـ RabbitMQ لإرسال الرسائل * Author Raye * */ @RestControllerPublic SendController تنفس على rabbittemplate.confirmcallback {private Rabbittempate ؛ /*** تكوين rabbittemplate لإرسال الرسائل. نظرًا لأنه مُنشئ ، سيتم حقن Spring تلقائيًا دون تعليق (يجب أن يكون ميزة الإصدار الجديد) * param rabbittemplate */ public sendController (rabbittemplate rabbittemplate) {this.rabbittemplate = rabbittemplate ؛ // تعيين رد الاتصال الاستهلاك this.rabbittemplate.setConfirmCallback (هذا) ؛ } / ** * أرسل رسالة إلى قائمة انتظار الرسائل 1 * param msg * regurn * / @requestmapping ("send1") السلسلة العامة send1 (String msg) {string uuid = uuid.randomuuid (). tostring () ؛ conslationData المراسلات = ارتباط جديد (uuid) ؛ rabbittemplate.convertandsend (rabbitmqconfig.exchange ، rabbitmqconfig.routingkey1 ، msg ، prossiledenceId) ؛ العودة لاغية. } / ** * أرسل رسالة إلى قائمة انتظار الرسائل 2 * param msg * return * / @requestmapping ("send2") send2 (String msg) {string uuid = uuid.randomuuid (). tostring () ؛ ارتباط ارتباط = ارتباط جديد (uuid) ؛ rabbittemplate.convertandsend (rabbitmqconfig.exchange ، rabbitmqconfig.routingkey2 ، msg ، conslationid) ؛ العودة لاغية. } / *** رد الاتصال بالرسائل ، بشكل رئيسي ، تطبيق rabbittemplate.confirmcallback* لاحظ أن عواصف الرسائل لا يمكن أن تمثل سوى رسائل ناجحة تم إرسالها إلى خادم RabbitMQ ، ولا يمكن أن تمثل الرسائل الناجحة التي يتم معالجتها وتقبلها* / public void تأكيد (interlationData المراسلة ، ack boolean ، string. if (ack) {system.out.println ("فشل استهلاك الرسائل:" + cause + "/n resend") ؛ }}}تجدر الإشارة إلى أن عمليات عروض الرسائل يمكن أن تمثل فقط الرسالة الناجحة التي يتم إرسالها إلى خادم RabbitMQ.
ثم نبدأ المشروع وزيارة http: // localhost: 8082/send1؟ msg = aaaa وستجد أن إخراج وحدة التحكم هو
رسالة وردت: AAAA
معرف رد الاتصال: ConnelationData [ID = 37E6E913-835A-4ECA-98D1-807325C5900F]
الاستهلاك الناجح للأخبار
بالطبع قد يكون معرف رد الاتصال مختلفًا. إذا قمنا بزيارة http: // localhost: 8082/send2؟ msg = bbbb ، سيكون الإخراج
Queue1 رسالة مستلمة: BBBB
معرف رد الاتصال: ConnelationData [id = 0cec7500-3117-4aa2-9ea5-4790879812d4]
الاستهلاك الناجح للأخبار
بضع كلمات في النهاية
نظرًا لأن هذه المقالة تشرح بشكل أساسي كيفية دمج RabbitMQ من الصفر إلى Springboot ، لا يوجد تفسير لكثير من المعلومات واستخدام RabbitMQ. إذا لم تكن على دراية بـ Rabbitmq نفسها ، فيمكنك التحقق من مقالات أخرى حول RabbitMQ ، وإرفاق العرض التوضيحي لهذه المقالة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.