في المقالة السابقة ، قمنا بتنفيذ التكوين المرن لنظام الرسائل. بدلاً من استخدام تكوين مفتاح المروحة. استخدم المفاتيح المباشرة والحصول على القدرة على تلقي الرسائل بشكل انتقائي بعد مفاتيح التوجيه.
على الرغم من أن استخدام مفاتيح الاتصال المباشر يمكن أن يحسن نظامنا ، إلا أنه لا يزال لديه قيود ولا يمكنه تنفيذ توجيه متعددة.
في نظام المراسلة الخاص بنا ، نريد الاشتراك ليس فقط في قائمة انتظار قائم على مفتاح التوجيه ، ولكن أيضًا إلى مصدر مستند إلى رسالة الإنتاج. هذه المفاهيم تأتي من SYSLOG أداة UNIX. يعتمد هذا السجل على طرق توجيه صارمة (معلومات/تحذير/crit ...) وسهلة (AUTH/CRON/KERN ...). مثالنا أبسط من هذا واحد.
سيعطينا هذا المثال الكثير من المرونة ، على سبيل المثال ، نريد الاستماع إلى كل من سجلات الأخطاء "Cron" وجميع السجلات من "Kern".
لتحقيق هذه المرونة ، نحتاج إلى معرفة المزيد عن مفاتيح الموضوعات.
مفتاح الموضوع
عند استخدام مفتاح موضوع ، لا يمكنك استخدام مفاتيح التوجيه التعسفي. يجب أن يكون تنسيق مفتاح التوجيه الكلمات مقسومًا على النقاط. أي كلمة تستخدمها عادة يمكن أن تعبر عن المعنى. على سبيل المثال "stock.usd.nyse" ، "NYSE.VMW" ، "Quick.orange.Rabbit". لكن حجم الكلمة يقتصر على 255 بايت كحد أقصى.
استخدم مفتاح السمة لتحديد مفاتيح التوجيه للانتباه إلى نقطتين
حدد مفاتيح التوجيه التي تطابق مفتاح الموضوع
في هذا المثال ، سنرسل جميع الرسائل التي تصف الحيوان. سيتم إرسال هذه الرسالة مع مفتاح توجيه يتكون من 3 كلمات ونقطتين. الكلمة الأولى هي التعبير عن السرعة ، والثاني يصف اللون ، والثالث يصف النوع: "<Pever>.
قم بإنشاء ثلاثة أنواع من الارتباطات ، Q1 والمفتاح "*.orange.*" الربط ، Q2 و "*.*. Rabbit" و "Lazy.#" Binding.
نظرة عامة على العلاقات الثلاثة الملزمة هي:
سيتم نقل رسالة مع مفتاح التوجيه إلى "Quick.orange.Rabbit" إلى قوائم انتظار Q1 و Q2. الشيء نفسه ينطبق على "lazy.orange.elephant" أيضًا. "Quick.orange.fox" سوف يذهب إلى قائمة الانتظار الأولى ، "Lazy.brown.fox" سوف يذهب إلى قائمة الانتظار الثانية ، وسيذهب "lazy.pink.rabbit" إلى قائمة الانتظار الثانية في الوقت المناسب. يطابق 2 روابط. "Quick.Brown.fox" سيتم التخلص منها بسبب عدم التوافق.
إذن ماذا عن "Orange" و "Quick.orange.male.Rabbit"؟ لأنه لا يوجد ربط مطابقة ، سيتم التخلص منه.
إذن ماذا عن مفاتيح التوجيه لـ "lazy.orange.male.Rabbit"؟ ، منذ كسول.
نصائح لمبادلات الموضوع
مفتاح السمة رائع ويعمل مشابهًا للمفاتيح الأخرى.
مثال رمز
لا يختلف الرمز عن رمز التوجيه السابق ، يرجى الاطلاع
config.java
package com.zb.ribbitmqtest.t5topics.config ؛ استيراد org.springframework.amqp.core.*؛ استيراد org.springframework.context.annotation.bean ؛ "T5Config") config classe {/*** تم إنشاؤه بواسطة: Zhang Bo* الوقت: 2018/3/5 10:45 AM* apinote DEFINE TOffice Exchange*/bean public topicexchange topicexchange () {return topicexchange new ("topic-exchange") ؛ }/*** Creator: Zhang Bo* الوقت: 2018/3/5 10:48 AM* apinote تعريف لحذف قائمة انتظار مجهولة المصدر تلقائيًا*/ @bean public queue autodeleteque0 () {return new Anonymouseue () ؛ }/*** Creator: Zhang Bo* الوقت: 2018/3/5 10:48 AM* apinote تعريف لحذف قائمة انتظار مجهولة المصدر تلقائيًا*/ @bean public queue autodeletequeue1 () {return new Anonymouseue () ؛ }/*** تم إنشاؤه بواسطة: Zhang Bo* الوقت: 2018/3/5 10:48 AM* Param TopicexChange Sweep Switch* param autodeleteque0 حذف قائمة الانتظار تلقائيًا* apinote binding (topicexice tootinge tootinge stiue quex quite Quitue Quitue Quitue Quitue Quitue Quitue. return bindingbuilder.bind (autodeletequeue0) .to to (TopicexChange) .with ("*. Orange.*") ؛ }/*** تم إنشاؤه بواسطة: Zhang bo* الوقت: 2018/3/5 10:48 AM* param topicexchange switch* param autodeletequeue1 قم بحذف قائمة الانتظار تلقائيًا* apinote binding intining1a intining1a (TOUPICEXINE1 مع مفتاح التوجيه الأسود إلى مفتاح tuther* return*/ @BINDINING BINDING1A autodeletequeue1) {return bindingbuilder.bind (autodeletequeue1) .to to (toupticexchange) .with ("*.*.. Rabbit") ؛ }/*** تم إنشاؤه بواسطة: Zhang Bo* الوقت: 2018/3/5 10:48 AM* Param TopicexChange Sweep Switch* param autodeletequeue1 حذف قائمة الانتظار تلقائيًا* apinote binding استخدام مفتاح التوجيه الأخضر إلى Queue to the Topic Toffice* regrourn*/ @bean public binding1b (topicexange toopice. return bindingbuilder.bind (autodeletequeue1) .to to (topicexchange). with ("lazy.#") ؛ }} المتلقي
package com.zb.ribbitmqtest.t5topics.receiver ؛ استيراد org.springframework.amqp.rabbit.annotation.RabbitListener ؛ import org.springframework.stereotype.cloatoD.component ؛/*** author zhang bo*/ @ @value = "t5ReCeiver". rabbitListener (queues = "#{autodeleteque0.name}") public void receiver0 (String str) {system.out.println ("requiver0 +++++++++:"+str) ؛ // حاول {// thread.sleep (1000) ؛ //} catch (interruptedException e) {// e.printstacktrace () ؛ //}} @rabbitListener (queues = "#{autodeletequeue1.name}") public void receiver1 (String str) {system.out.println ("requiver1 +++++++++:"+str) ؛ // حاول {// thread.sleep (1000) ؛ //} catch (interruptedException e) {// e.printstacktrace () ؛ //}}} send.java
package com.zb.ribbitmqtest.t5topics.send ؛ استيراد org.springframework.amqp.core.topicexchange ؛ استيراد org.springframework.amqp.rabbit.core.rabbittemplate org.springframework.stereotype.component ؛/*** Author Zhang bo*/ @component (value = "t5send") الفئة العامة إرسال {autowired private TopicexChange TopicexChange ؛ @autowired rabbittemplate rabbittemplate ؛ سلسلة خاصة [] keys = {"Quick.orange.Rabbit" ، "lazy.orange.elephant" ، "Quick.orange.fox" ، "lazy.brown.fox" ، "lazy.pink.Rabbit" ، "Quick.brown.fox"} ؛ public void send () {string message = "hahaha" ؛ لـ (int i = 0 ؛ i <5 ؛ i ++) {system.out.println ("send +++++++++++:". concat (message)) ؛ rabbittemplate.convertandsend (topicexchange.getName () ، Keys [5] ، message) ؛ }}} sendtest.java
package com.zb.ribbitmqtest.t5topics.send ؛ استيراد org.junit.test ؛ استيراد org.junit.runner.runwith ؛ استيراد org.springframework.beans.factory.annotation.autowired org.springframework.test.context.junit4 test public void send () rems {send.send () ؛ }}لن أترك نتائج الاختبار ، يرجى التحقق من ذلك بنفسك.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.