路由模式
路由模式下創建RabbitMq實例需要傳入交換機exchange和routingkey
func NewRabbitMqRouting(exchange, routingKey string) *RabbitMq {
//創建rabbitmq實例
rabbitmq := NewRabbitMq("", exchange, routingKey)
return rabbitmq
}
生產者:
1、嘗試創建交換機,kind爲direct模式
2、發送消息channel.Publish, 傳入交換機,routingkey
func (r *RabbitMq) PublishRouting(message string) {
//1. 嘗試創建交換機
err := r.channel.ExchangeDeclare(
r.Exchange,
"direct",
//是否持久化
false,
//
false,
false,
false,
nil)
r.failOnErr(err, "failed to declare an exchange")
//2. 發送消息
r.channel.Publish(
//交換機
r.Exchange,
r.Key,
false,
false,
//發送的信息
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(message),
})
}
消費者
1、嘗試創建交換機 參數爲exchange, 模式爲direct
2、申請隊列,隊列名稱爲空
3、綁定隊列到交換機中,傳入隊列名稱q.Name, r.Exchange, r.Key
4、channel.Consume消費消息,消費消息只需要傳入隊列名稱即可,所有模式都一樣
func(r *RabbitMq)RecieveRouting(){
//嘗試創建交換機
err := r.channel.ExchangeDeclare(
r.Exchange,
"direct",
//是否持久化
false,
//
false,
false,
false,
nil)
r.failOnErr(err, "failed to declare an exchange")
//2 嘗試創建隊列
q, err := r.channel.QueueDeclare(
"",
false,
false,
true,
false,
nil)
r.failOnErr(err, "failed to declare an queue")
//3 綁定隊列到exchange中
err = r.channel.QueueBind(
q.Name,
r.Key,
r.Exchange,
false,
nil)
//消費消息
msgs, err := r.channel.Consume(
q.Name,
"",
true,
false,
false,
false,
nil)
if err != nil {
fmt.Printf("channel.Consume failed, error:%+v\n", err)
return
}
forever := make(chan bool)
go func() {
for d := range msgs {
//實現我們要處理的邏輯函數
log.Printf("Received a message:%s", d.Body)
}
}()
log.Printf("[*] Waiting for message, exit to press CTRL + C")
<-forever
}
使用案例
生產者
package main
import (
"rabbitmq/RabbitMq"
"strconv"
"time"
)
func main() {
imoocOne := RabbitMq.NewRabbitMqRouting("exImooc", "imooc_one")
imoocTwo := RabbitMq.NewRabbitMqRouting("exImooc", "imooc_two")
for i := 0; i < 10; i++ {
imoocOne.PublishRouting("imooc one " + strconv.Itoa(i))
imoocTwo.PublishRouting("imooc two " + strconv.Itoa(i))
time.Sleep(10 * time.Millisecond)
}
}
消費者
package main
import "rabbitmq/RabbitMq"
func main(){
rabbitmq := RabbitMq.NewRabbitMqRouting("exImooc", "imooc_one")
rabbitmq.RecieveRouting()
}
===============================================================
package main
import (
"rabbitmq/RabbitMq"
)
func main(){
rabbitmq := RabbitMq.NewRabbitMqRouting("exImooc", "imooc_two")
rabbitmq.RecieveRouting()
}
分析:
生產者生產交換機爲exImooc,routingKey爲:imooc_one 和 imooc_two的生產者
兩個消費者分別創建imooc_one 和 imooc_two的兩個rabbitmq實例,進行消費
消費者1只能獲取到imooc_one的消息
消費者2只能獲取到imooc_two的消息
輸出結果
消費者1
2019/07/04 11:55:02 [*] Waiting for message, exit to press CTRL + C
2019/07/04 11:55:16 Received a message:imooc one 0
2019/07/04 11:55:16 Received a message:imooc one 1
2019/07/04 11:55:16 Received a message:imooc one 2
2019/07/04 11:55:16 Received a message:imooc one 3
2019/07/04 11:55:16 Received a message:imooc one 4
2019/07/04 11:55:16 Received a message:imooc one 5
2019/07/04 11:55:16 Received a message:imooc one 6
2019/07/04 11:55:16 Received a message:imooc one 7
2019/07/04 11:55:16 Received a message:imooc one 8
2019/07/04 11:55:16 Received a message:imooc one 9消費者2
2019/07/04 11:55:06 [*] Waiting for message, exit to press CTRL + C
2019/07/04 11:55:16 Received a message:imooc two 0
2019/07/04 11:55:16 Received a message:imooc two 1
2019/07/04 11:55:16 Received a message:imooc two 2
2019/07/04 11:55:16 Received a message:imooc two 3
2019/07/04 11:55:16 Received a message:imooc two 4
2019/07/04 11:55:16 Received a message:imooc two 5
2019/07/04 11:55:16 Received a message:imooc two 6
2019/07/04 11:55:16 Received a message:imooc two 7
2019/07/04 11:55:16 Received a message:imooc two 8
2019/07/04 11:55:16 Received a message:imooc two 9