โหมดหัวข้อของ RabbitMQ ภาษา Golang คล้ายกับโหมดเส้นทาง (Direct) โดยความแตกต่างที่สำคัญคือพารามิเตอร์ในการเส้นทางในโหมดหัวข้อรองรับการจับคู่ที่ไม่แน่นอน ประเภทแลกเปลี่ยนสำหรับโหมดหัวข้อคือ 'topic'。

สถาปัตยกรรมของโหมดหัวข้อเป็นดังนี้: RabbitMQ โหมดหัวข้อ

หมายเหตุ: หากคุณไม่คุ้นเคยกับโหมดหัวข้อของ RabbitMQ โปรดอ่านส่วน โหมดหัวข้อของ RabbitMQ ก่อน。

1. บทช่วยสอนที่ต้องการ

กรุณาอ่านส่วนต่อไปนี้ตามลำดับ:

หมายเหตุ: เนื่องจากส่วนของ Golang RabbitMQ การเผยแพร่/สับสนี้มีตัวอย่างรหัสเต็มรูปแบบแล้ว ประกาศแต่เพียงการถดถอยและพารามิเตอร์ในการเส้นทางที่แตกต่างนั้นเท่านั้น ดังนั้นแสดงเพียงรหัสคีย์เท่านั้น。

2. การประกาศการแลกเปลี่ยนหัวข้อ

err = ch.ExchangeDeclare(
  "tizi365_topic", // ชื่อการแลกเปลี่ยน, จำเป็นต้องเป็นเอกลักษณ์
  "topic",         // ประเภทการแลกเปลี่ยน
  true,            // ทนทาน
  false,           // ลบโดยอัตโนมัติ
  false,           // ภายใน
  false,           // ไม่รอ
  nil,             // อาร์กิวเมนต์
)

3. การส่งข้อความ

    // เนื้อหาข้อความ
    body := "สวัสดี Tizi365.com!"

    // การเผยแพร่ข้อความ
    err = ch.Publish(
        "tizi365_topic",      // ชื่อการแลกเปลี่ยน
        "www.tizi365.com",    // พารามิเตอร์การเส้นทาง, ค่าพารามิเตอร์สำคัญที่กำหนดว่าข้อความของคุณจะถูกส่งไปยังคิวไหน
        false,                // บังคับ
        false,                // ทันที
        amqp.Publishing {
            ContentType: "text/plain", // ประเภทเนื้อหาข้อความ, ที่นี่คือข้อความธรรมดา
            Body:        []byte(body),  // เนื้อหาข้อความ
        })

4. การบริโภคข้อความ

4.1. การผูกแลกเปลี่ยน

// ประกาศคิวที่จะทำงาน
    q, err := ch.QueueDeclare(
        "",    // ชื่อคิว, ถูกสร้างขึ้นแบบสุ่มหากไม่ระบุ
        false, // คิวทนทาน
        false, // ลบเมื่อไม่ได้ใช้งาน
        true,  // พิเศษ
        false, // ไม่รอ
        nil,   // อาร์กิวเมนต์
    )

    // ผูกคิวไปยังการแลกเปลี่ยนที่ระบุ
    err = ch.QueueBind(
        q.Name,             // ชื่อคิว
        "*.tizi365.com",    // พารามิเตอร์การเส้นทาง, พารามิเตอร์ที่สำคัญโดยใช้* เพื่อจับคู่กับคำศัพท์ ถ้าใช้ # ก็สามารถจับคู่กับคำศัพท์หลายคำ
        "tizi365_topic",    // ชื่อการแลกเปลี่ยน, จำเป็นต้องตรงกับการแลกเปลี่ยนที่ถูกกำหนดโดยผู้ส่งข้อความ
        false,
        nil)

4.2. การจัดการข้อความ

// สร้างผู้บริโภค
    msgs, err := ch.Consume(
        q.Name, // อ้างอิงชื่อคิวด้านบน
        "",     // ชื่อผู้บริโภค, ถูกสร้างโดยอัตโนมัติหากไม่ได้ระบุ
        true,   // การรับรองการรับทราบโดยอัตโนมัติไปยังคิวที่ส่งข้อความไปแล้ว
        false,  // พิเศษ
        false,  // ไม่คนท้องเรือ
        false,  // ไม่รอ
        nil,    // อาร์กิวเมนต์
    )

    // เรียกใช้กั้นการบริโภคข้อความในคิว
    for d := range msgs {
        log.Printf("ได้รับข้อความ=%s", d.Body)
    }