Golang RabbitMQ主题(topic)模式,跟路由模式(Direct)类似,最大的区别就是主题模式的路由参数支持模糊匹配,主题模式的交换机类型为:topic。
主题模式架构如下:
提示:不了解RabbitMQ主题模式,请先阅读RabbitMQ主题模式章节。
1.前置教程
请先按顺序阅读下面章节
说明:因为Golang RabbitMQ发布订阅章节,已经包含完整的代码样例,其他RabbitMQ模式,仅仅是交换机的定义和路由参数不一样,所以仅展示关键代码。
2.声明Topic交换机
err = ch.ExchangeDeclare(
"tizi365_topic", // 交换机名字,需要唯一
"topic", // 交换机类型
true, // 是否持久化
false, // auto-deleted
false, // internal
false, // no-wait
nil, // arguments
)
3.发送消息
// 消息内容
body := "Hello Tizi365.com!"
// 推送消息
err = ch.Publish(
"tizi365_topic", // exchange(交换机名字)
"www.tizi365.com", // 路由参数,关键参数,决定你的消息会发送到那个队列。
false, // mandatory
false, // immediate
amqp.Publishing {
ContentType: "text/plain", // 消息内容类型,这里是普通文本
Body: []byte(body), // 消息内容
})
4.消费消息
4.1.绑定交换机
// 声明需要操作的队列
q, err := ch.QueueDeclare(
"", // 队列名字,不填则随机生成一个
false, // 是否持久化队列
false, // delete when unused
true, // exclusive
false, // no-wait
nil, // arguments
)
// 队列绑定指定的交换机
err = ch.QueueBind(
q.Name, // 队列名
"*.tizi365.com", // 路由参数,关键参数,使用了通配符 * 星号,匹配一个单词,如果使用 # 井号可以匹配多个单词.
"tizi365_topic", // 交换机名字,需要跟消息发送端定义的交换器保持一致
false,
nil)
4.2.处理消息
// 创建消费者
msgs, err := ch.Consume(
q.Name, // 引用前面的队列名
"", // 消费者名字,不填自动生成一个
true, // 自动向队列确认消息已经处理
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
// 循环消费队列中的消息
for d := range msgs {
log.Printf("接收消息=%s", d.Body)
}