ในบทความก่อนหน้านี้เราใช้การกำหนดค่าที่ยืดหยุ่นของระบบข้อความ แทนที่จะใช้การกำหนดค่าสวิตช์ Fanout ใช้สวิตช์โดยตรงและมีความสามารถในการเลือกรับข้อความหลังจากปุ่มกำหนดเส้นทาง
แม้ว่าการใช้สวิตช์เชื่อมต่อโดยตรงสามารถปรับปรุงระบบของเราได้ แต่ก็ยังมีข้อ จำกัด และไม่สามารถใช้การกำหนดเส้นทางหลายเงื่อนไขได้
ในระบบการส่งข้อความของเราเราต้องการสมัครสมาชิกไม่เพียง แต่ไปยังคิวคีย์ตามเส้นทางเท่านั้น แต่ยังรวมถึงแหล่งที่มาจากข้อความการผลิต แนวคิดเหล่านี้มาจาก Syslog เครื่องมือ Unix บันทึกนี้ขึ้นอยู่กับความเข้มงวด (ข้อมูล/เตือน/crit ... ) และวิธีการกำหนดเส้นทางง่าย (auth/cron/kern ... ) ตัวอย่างของเราง่ายกว่านี้
ตัวอย่างนี้จะทำให้เรามีความยืดหยุ่นมากตัวอย่างเช่นเราต้องการฟังทั้งบันทึกข้อผิดพลาด 'cron' และบันทึกทั้งหมดจาก 'kern'
เพื่อให้บรรลุความยืดหยุ่นนี้เราจำเป็นต้องรู้เพิ่มเติมเกี่ยวกับสวิตช์หัวข้อ
สวิตช์ธีม
เมื่อใช้สวิตช์หัวข้อคุณไม่สามารถใช้ปุ่มกำหนดเส้นทางโดยพลการ รูปแบบของคีย์การกำหนดเส้นทางควรเป็นคำหารด้วยคะแนน คำใด ๆ ที่คุณใช้สามารถแสดงความหมายได้ ตัวอย่างเช่น "stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit" แต่ขนาดคำนั้น จำกัด อยู่ที่สูงสุด 255 ไบต์
ใช้สวิตช์ธีมเพื่อกำหนดคีย์การกำหนดเส้นทางเพื่อให้ความสนใจกับ 2 คะแนน
กำหนดคีย์การกำหนดเส้นทางที่ตรงกับสวิตช์หัวข้อ
ในตัวอย่างนี้เราจะส่งข้อความทั้งหมดที่อธิบายสัตว์ ข้อความนี้จะถูกส่งร่วมกับคีย์การกำหนดเส้นทางประกอบด้วย 3 คำและ 2 คะแนน คำแรกคือการแสดงความเร็วที่สองอธิบายสีและคำที่สามอธิบายประเภท: "<peed>. <color>. <pecle>"
สร้างการผูกสามประเภทคือ Q1 และคีย์ "*.orange.*" การเชื่อมโยง, Q2 และ "*.*. Rabbit" และ "Lazy.#" ผูกพัน
ภาพรวมของความสัมพันธ์ที่มีผลผูกพันทั้งสามคือ:
ข้อความที่มีคีย์การกำหนดเส้นทางตั้งค่าเป็น "quick.orange.rabbit" จะถูกส่งผ่านไปยังคิว Q1 และ Q2 เช่นเดียวกันสำหรับ "lazy.orange.elephant" ด้วย "quick.orange.fox" จะไปที่คิวแรก "lazy.brown.fox" จะไปที่คิวที่สองและ "lazy.pink.rabbit" จะไปที่คิวที่สองในเวลา มันตรงกับ 2 การผูก "quick.brown.fox" จะถูกทิ้งเพราะไม่ตรงกัน
แล้ว "สีส้ม" และ "quick.orange.male.rabbit" ล่ะ? เนื่องจากไม่มีการจับคู่ที่มีผลผูกพันจึงจะถูกทิ้ง
แล้วคีย์การกำหนดเส้นทางของ "lazy.orange.male.rabbit" ล่ะ? เนื่องจากขี้เกียจ# จับคู่สิ่งนี้จะถูกส่งผ่านไปยังคิวที่สอง
เคล็ดลับสำหรับตัวแลกเปลี่ยนธีม
สวิตช์ธีมนั้นยอดเยี่ยมและทำหน้าที่คล้ายกับสวิตช์อื่น ๆ
ตัวอย่างรหัส
รหัสไม่แตกต่างจากรหัสเส้นทางก่อนหน้านี้โปรดดู
config.java
แพ็คเกจ com.zb.rabbitmqtest.t5topics.config; นำเข้า org.springframework.amqp.core.*; นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation "t5config") คลาสสาธารณะ config {/*** สร้างโดย: จางโบ* เวลา: 2018/3/5 10:45 am* @apinote กำหนดหัวข้อแลกเปลี่ยนหัวข้อ*/@bean สาธารณะ topicexchange topicexchange () {ส่งคืน topicexchange ใหม่ ("exchange"); }/*** ผู้สร้าง: Zhang Bo* เวลา: 2018/3/5 10:48 AM* @apinote นิยามเพื่อลบคิวนิรนามโดยอัตโนมัติ*/@bean สาธารณะ Autodeletequeue0 () {ส่งคืน anonymousequeue ใหม่ (); }/*** ผู้สร้าง: Zhang Bo* เวลา: 2018/3/5 10:48 AM* @apinote นิยามเพื่อลบคิวนิรนามโดยอัตโนมัติ*/@bean สาธารณะ Autodeletequeue1 () {ส่งคืน Anonymousequeue ใหม่ (); }/*** สร้างโดย: Zhang Bo* เวลา: 2018/3/5 10:48 AM* @Param TopicexChange Switch* @param Autodeletequeue0 โดยอัตโนมัติลบคิว* @apinote binding ใช้การผูกคีย์ส้ม autodeletequeue0) {return bindingbuilder.bind (autodeletequeue0) .to (topicexchange). with ("*. orange.*"); }/*** สร้างโดย: Zhang Bo* เวลา: 2018/3/5 10:48 AM* @Param TopicexChange Switch* @param Autodeletequeue1 ลบคิว* @apinote binding โดยใช้การผูกมัด AutodeLetE1 autodeletequeue1) {return bindingbuilder.bind (autodeletequeue1) .to (topicexchange). with ("*.*. กระต่าย"); }/*** สร้างโดย: Zhang Bo* เวลา: 2018/3/5 10:48 AM* @Param TopicexChange Switch* @param Autodeletequeue1 ลบคิว* @apinote binding ใช้คีย์การกำหนดเส้นทางไปยังคิว autodeletequeue1) {return bindingbuilder.bind (autodeletequeue1) .to (topicexchange). with ("ขี้เกียจ#"); - ผู้รับ. java
แพ็คเกจ com.zb.rabbitmqtest.t5topics.receiver; นำเข้า org.springframework.amqp.rabbit.annotation.rabbitListener; นำเข้า org.springframework.stereotype.component; @RabBitListEner (queues = "#{Autodeletequeue0.Name}") โมฆะสาธารณะตัวรับสัญญาณ 0 (String str) {system.out.println ("ตัวรับสัญญาณ 0 +++++++++++ // ลอง {// thread.sleep (1,000); //} catch (interruptedException e) {// e.printStackTrace (); //}} @RabBitListEner (queues = "#{Autodeletequeue1.Name}") โมฆะสาธารณะตัวรับสัญญาณ 1 (String str) {system.out.println ("ตัวรับ 1 ++++++++++++++++ // ลอง {// thread.sleep (1,000); //} catch (interruptedException e) {// e.printStackTrace (); - send.java
แพ็คเกจ com.zb.rabbitmqtest.t5topics.send นำเข้า org.springframework.amqp.core.topicexchange; นำเข้า org.springframework.amqp.rabbit.core.rabbittemplate; org.springframework.stereotype.Component;/*** @author Zhang Bo*/ @Component (value = "T5Send") คลาสสาธารณะส่ง {@autowired TopicexChange TopicexChange; @autowired ส่วนตัว Rabbittemplate Rabbittemplate; สตริงส่วนตัว [] keys = {"quick.orange.rabbit", "lazy.orange.elephant", "quick.orange.fox", "lazy.brown.fox", "lazy.pink.rabbit", "quick.brown.fox"}; โมฆะสาธารณะส่ง () {ข้อความสตริง = "ฮ่าฮ่าฮ่า"; สำหรับ (int i = 0; i <5; i ++) {system.out.println ("ส่ง +++++++++++++:" concat (ข้อความ)); Rabbittemplate.convertandsend (topicexchange.getName (), คีย์ [5], ข้อความ); - sendtest.java
แพ็คเกจ com.zb.rabbitmqtest.t5topics.send นำเข้า org.junit.test; นำเข้า org.junit.runner.runwith; นำเข้า org.springframework.beans.factory.annotation.autowired; org.springframework.test.context.junit4.springrunner;/*** @author Zhang Bo*/ @runwith(springrunner.class)@springboottestpublic คลาส Sendtest {@autowired ส่วนตัวส่งส่ง; @Test โมฆะสาธารณะส่ง () พ่นข้อยกเว้น {send.Send (); -ฉันจะไม่ทิ้งผลการทดสอบโปรดตรวจสอบด้วยตัวเอง
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น