ملخص
المفاهيم الأساسية
وسيط
كيان خادم قائمة انتظار الرسائل المستخدمة لمعالجة البيانات
VHOST
يحتوي مضيف الرسائل الافتراضية التي أنشأها خادم RabbitMQ على آلية الإذن الخاصة به. يمكن فتح VHosts المتعددة في وسيط لعزل الإذن لمستخدمي مختلفين ، كما أن VHosts معزولة تمامًا.
منتج
إنشاء بيانات للاتصال بالرسالة
قناة
قناة الرسائل ، يمكن إنشاء قنوات متعددة في AMQP ، تمثل كل قناة مهمة جلسة.
تبادل
مباشر
إعادة توجيه الرسائل إلى قائمة الانتظار المحددة عن طريق مفتاح التوجيه
المعجبين
المعجبين
يشبه إعادة توجيه الرسائل إلى جميع قوائم الانتظار المرتبطة طريقة البث.
عنوان
عنوان
الرسائل إلى الأمام وفقًا للقواعد. هذه القاعدة هي في الغالب مطابقة للأنماط ، ويبدو أيضًا أكثر مرونة.
طابور
طابور
ملزم
إنه يمثل العلاقة بين المفتاح وقائمة الانتظار. عند الربط ، يأتي مع مفتاح ربط معلمة إضافية لمطابقة مفتاح التوجيه.
مستهلك
استمع إلى قائمة انتظار الرسائل لقراءة بيانات الرسالة
ثلاثة أوضاع للتبادل (Fanout ، Direct ، Topic) تنفيذ بموجب Springboot
مرجع Spring-Boot-Starter-AMQP في pom.xml
<Rependency> <roupiD> org.springframework.boot </rougiD> <StifactId> Spring-Boot-Starter-AMQP </stifactid> </sependency>
إضافة تكوين RabbitMQ
الربيع: RabbitMQ: المضيف: المنفذ المحلي: 5672 اسم المستخدم: كلمة مرور الضيف: ضيف
مباشر
في الوضع المباشر ، لا يلزم سوى قائمة الانتظار لتحديده بشكل عام. استخدم المفتاح المدمج (DefaultExchange) دون ربط المفتاح.
ConfigurationPublic class rabbitp2pconfigure {public static final string queue_name = "p2p-queue" ؛ Queue public queue () {return new Queue (queue_name ، true) ؛ }} Runwith (SpringRunner.class) springBoottest (الفئات = bootcoretestapplication.class)@slf4jpublic class rabbittest {autowired private amqptemplate amqptemplate ؛ / *** إرسال*/ test public void sendlazy () رميات InterruptedException {City City = New City (234556666l ، "Direct_Name" ، "Direct_Code") ؛ amqptemplate.convertandsend (RabbitlazyConfigure.queue_name ، City) ؛ } / *** استقبال* / test public void rece () remrowsedexception {object obj = amqptemplate.receiveAndConvert (rabbitlazyConfigure.queue_name) ؛ Assert.notnull (obj ، "") ؛ log.debug (obj.toString ()) ؛ }}السيناريوهات المعمول بها: نقطة إلى نقطة
المعجبين
يتطلب وضع المروحة ربط قوائم انتظار متعددة لنفس المفتاح
ConfigurationPublic class rabbitfanoutConfigure {public static Final String Exchange_name = "fanout-exchange" ؛ Static Final String Fanout_a = "Fanout.a" ؛ Static Final String Fanout_b = "Fanout.b" ؛ Static Final String Fanout_C = "Fanout.c" ؛ @bean public queue amessage () {return new Queue (fanout_a) ؛ } @bean public queue bmessage () {return new Queue (fanout_b) ؛ } @bean public queue cmessage () {return new Queue (fanout_c) ؛ } bean public fanoutexchange fanoutexchange () {return new fanoutexchange (exchange_name) ؛ } Bean public bindingexchangea (قائمة الانتظار amessage ، fanoutexchange fanoutexchange) {return bindingbuilder.bind (amessage) .to to (fanoutexchange) ؛ } binding bindingexchangeb (Queue bmessage ، fanoutexchange fanoutexchange) {return bindingbuilder.bind (bmessage) .to to (fanoutexchange) ؛ } Bean public bindingexchangec (قائمة الانتظار cmessage ، fanoutexchange fanoutexchange) {return bindingbuilder.bind (cmessage) .to to (fanoutexchange) ؛ }}مرسل
@slf4jpublic class sender {Autowired private AmqPtemplate rabbittemplate ؛ public void sendfanout (رسالة الكائن) {log.debug ("ابدأ إرسال رسالة Fanout <" + message + ">") ؛ rabbittemplate.convertandsend (rabbitfanoutConfigure.exchange_name ، "" ، message) ؛ }}يمكننا استخدام rabbitListener للاستماع إلى قوائم قوائم متعددة للاستهلاك
@slf4j @rabbitlistener (queues = {rabbitfanoutConfigure.fanout_a ، rabbitfanoutConfigure.fanout_b ، rabbitfanoutConfigure.fanout_c}) مستقبل الفئة العامة {rabbithandler public receivemessage (سلسلة) {log.debug (" }} السيناريوهات المعمول بها
-يمكن لألعاب مستخدمي متعددة المستخدمين على نطاق واسع (MMO) استخدامها للتعامل مع الأحداث العالمية مثل تحديثات الترتيب
- يمكن لمواقع الأخبار الرياضية استخدامها لتوزيع تحديثات الدرجات لعملاء الأجهزة المحمولة في الوقت الفعلي بالقرب من الوقت الحقيقي
- نظام التوزيع يستخدمه لبث حالات مختلفة وتحديثات التكوين
- أثناء الدردشة الجماعية ، يتم استخدامه لتوزيع الرسائل على المستخدمين المشاركين في الدردشة الجماعية.
عنوان
هذا النمط معقد نسبيا. ببساطة ، كل قائمة انتظار لها موضوع قلق خاص بها. جميع الرسائل لها "عنوان". سيقوم Exchange بإعادة توجيه الرسائل إلى قوائم الانتظار التي تتعلق مواضيعها بالتعليقات الغامضة.
عند الربط ، قدم موضوعًا يتعلق بقائمة الانتظار ، مثل "الموضوع.# ("# "يعني 0 أو عدة كلمات رئيسية ، و"*"تعني كلمة رئيسية.)
ConfigurationPublic class rabbittopicConfigure {public static Final String Exchange_name = "Topic-exchange" ؛ موضوع سلسلة نهائي ثابت = "Topic" ؛ Static Final String Topic_A = "Topic.A" ؛ Static Final String Topic_B = "Topic.B" ؛ bean public QueueToPic () {return new Queue (rabbittopicConfigure.topic) ؛ } @bean public QueUetopica () {return new Queue (rabbittopicConfigure.topic_a) ؛ } @bean public QueUeTopicB () {return new Queue (rabbittopicConfigure.topic_b) ؛ } bean public TopicexChange Exchange () {TopicexChange TopicexChange = جديد TopicexChange (Exchange_Name) ؛ topicexchange.setDelayed (true) ؛ إرجاع TopicexChange جديد (Exchange_Name) ؛ } Bean public bindingexchangetopic (Queue QueuetOpic ، topicexchange Exchange) {return bindingbuilder.bind (queuetopic). to (Exchange). with (rabbittopicConfigure.topic) ؛ } binding bindingexchangetopics bindingexchangetopics (QueueTopica ، Exchange topicexchange) {return bindingbuilder.bind (queuetopica) .to (Exchange) .with ("topic.#") ؛ }}في الوقت نفسه ، استمع إلى ثلاث قوائم
@slf4j @rabbitlistener (queues = {RabbittopicConfigure.topic ، rabbittopicConfigure.topic_a ، rabbittopicConfigure.topic_b}) مستلم الفئة العامة { @rabbithandler public void (message) {log.debug (" }}من خلال الاختبار يمكننا أن نجد
Runwith (SpringRunner.class) springBOOTTEST (الفئات = bootcoretestapplication.class) الطبقة العامة rabbittest {autowired private amqptemplate rabbittemplate ؛ test public void sendall () {rabbittemplate.convertandsend (rabbittopicConfigure.exchange_name ، "topic.test" ، "send all") ؛ } test public void sendtopic () {RabbitTemplate.ConvertandSend (rabbittopicConfigure.exchange_name ، rabbittopicConfigure.topic ، "send topic") ؛ } test public void sendtopica () {RabbitTemplate.Convertandsend (RabbittopicConfigure.exchange_name ، rabbittopicConfigure.topic_a ، "send topica") ؛ }} السيناريوهات المعمول بها
- توزيع البيانات حول مواقع جغرافية محددة ، مثل نقطة البيع
- مهام وراء الكواليس التي يكملها العديد من العمال ، كل عامل مسؤول عن التعامل مع بعض المهام المحددة
- تحديثات أسعار السهم (وأنواع أخرى من تحديثات البيانات المالية)
- تحديثات الأخبار التي تتضمن فئات أو علامات (على سبيل المثال ، للرياضات أو الفرق المحددة)
- تنسيق أنواع مختلفة من الخدمات في السحابة
- حزمة برامج الهندسة المعمارية/النظام القائمة على النظام ، حيث يمكن لكل منشئ التعامل مع بنية أو نظام محدد واحد فقط.
قائمة انتظار التأخير
الاستهلاك المتأخر:
إعادة المحاولة المتأخرة:
قم بتعيين خاصية تأخير التبديل على True
ConfigurationPublic class rabbitlazyConfigure {public static final string queue_name = "lazy-queue-t" ؛ Static Final String Exchange_name = "Lazy-exchange-T" ؛ Queue public queue () {return new Queue (queue_name ، true) ؛ } bean public directExchange defaultExchange () {directExchange directExchange = new DirectExchange (Exchange_name ، true ، false) ؛ directExchange.setDelayed (true) ؛ إرجاع DirectExchange ؛ } bean public binding () {return bindingbuilder.bind (queue ()). to (defaultexchange ()). with (queue_name) ؛ }}حدد وقت التأخير عند الإرسال
@slf4jpublic class sender {Autowired private AmqPtemplate rabbittemplate ؛ public void sendlazy (object msg) {log.debug ("ابدأ إرسال رسالة كسول <" + msg + ">") ؛ rabbittemplate.convertandsend (RabbitlazyConfigure.exchange_name ، rabbitlazyconfigure.queue_name ، msg ، message -> {message.getMessageProperties (). }}ينهي
يرجى التحقق من المستندات الرسمية مباشرة لمختلف حالات الاستخدام
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.