package main
import (
"context"
"fmt"
"github.com/streadway/amqp"
"learning_tools/rabbitmq/mq"
"time"
)
/**
在这里我会建立二个消费者和一个生产者
*/
func main() {
ctx, cancel := context.WithCancel(context.Background())
//生产者
go Sample(ctx)
//消费者
go mq.SampleConsumption(ctx, "q1", "c1")
go mq.SampleConsumption(ctx, "q2", "c2")
time.Sleep(2 * time.Second)
cancel()
}
func Sample(ctx context.Context) {
// 创建连接
connection := mq.Connection()
defer connection.Close()
// 开启 channel
channel, err := connection.Channel()
if err != nil {
panic(err)
}
defer channel.Close()
//创建一个交换器
if err = channel.ExchangeDeclare(
"e3",
amqp.ExchangeTopic,
true,
false,
false,
true,
nil); err != nil {
panic(err)
}
//创建一个队列 q1
if _, err := channel.QueueDeclare("q1",
true,
false,
false,
true,
nil); err != nil {
panic(err)
}
//创建一个队列 q2
if _, err := channel.QueueDeclare("q2",
true,
false,
false,
true,
nil); err != nil {
panic(err)
}
//交换机和队列绑定
//这里key以.隔开,#代表任意一个字符串或者没有,*代表任意一个字符串
//vvv.orange.rabbit.oo 只能匹配到q2队列里面
if err = channel.QueueBind("q1", "*.orange.*", "e3", true, nil); err != nil {
panic(err)
}
if err = channel.QueueBind("q2", "*.*.rabbit.#.#", "e3", true, nil); err != nil {
panic(err)
}
// Publish 生产一条消息 这里生产者和队列没有关系,这是吧消息放在交换器里面,由交换器觉得给那个队列
for i := 0; i < 5; i++ {
//time.Sleep(time.Second / 4)
if err = channel.Publish("e3",
"vvv.orange.rabbit.oo",
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)
}
}
}
08-10
08-10
08-10
08-10