package main
import (
"context"
"fmt"
"github.com/streadway/amqp"
"learning_tools/rabbitmq/mq"
"time"
)
/**
这里使用direct类型交换器
把消息投递到 BindingKey 和 RoutingKey 完全匹配的队列中
*/
func main() {
ctx, cancel := context.WithCancel(
.Background())
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
panic(err)
}
// 开启 channel
channel, err := conn.Channel()
if err != nil {
panic(err)
}
//创建一个交换器
if err = channel.ExchangeDeclare(
"e2",
amqp.ExchangeDirect, //这里选择他的类型
true,
false,
false,
true,
nil); err != nil {
panic(err)
}
//创建一个队列 q1
qd1, err := channel.QueueDeclare("q1",
true,
false,
false,
true,
nil);
if err != nil {
panic(err)
}
qd2, err := channel.QueueDeclare("q2",
true,
false,
false,
true,
nil);
if err != nil {
panic(err)
}
//交换机和队列绑定 ,这里间隔队列绑定在一个交换器上面
if err = channel.QueueBind(qd1.Name, "a", "e2", true, nil); err != nil {
panic(err)
}
if err = channel.QueueBind(qd2.Name, "b", "e2", true, nil); err != nil {
panic(err)
}
//消费者
go mq.SampleConsumption(ctx, "q1", "c1")
go mq.SampleConsumption(ctx, "q2", "c2")
/**
开始发送消息到队列
*/
for i := 0; i < 5; i++ {
if err = channel.Publish("e2",
"b",
false,
false,
amqp.Publishing{
Timestamp: time.Now(),
DeliveryMode: amqp.Persistent,
ContentType: "text/plain",
Body: []byte(fmt.Sprintf("%d:,Hello Rabbit MQ!", i)),
}); err != nil {
panic(err)
}
}
time.Sleep(time.Second * 2)
cancel()
time.Sleep(time.Second * 1)
}
注意:BindingKey 分别为a、b,而 RoutingKey 为b,这时候消息都会发送BindingKey为b的绑定队列里面,这也是direct类型交换器的使用