golang操作RabbitMQ--话题模式

创建连接及RabbitMQ结构体实例代码见 https://www.cnblogs.com/prince5460/p/11895844.html

1.创建话题模式RabbitMQ实例

func NewRabbitMQTopic(exchangeName, routingKey string) *RabbitMQ {
	//创建RabbitMQ实例
	rabbitmq := NewRabbitMQ("", exchangeName, routingKey)
	var err error
	//获取connection
	rabbitmq.conn, err = amqp.Dial(rabbitmq.Mqurl)
	rabbitmq.failOnErr(err, "Failed to connect rabbitmq!")
	//获取channel
	rabbitmq.channel, err = rabbitmq.conn.Channel()
	rabbitmq.failOnErr(err, "Failed to open a channel!")
	return rabbitmq
}

2.话题模式发送消息

func (r *RabbitMQ) PublishTopic(message string) {
	//1.尝试创建交换机
	err := r.channel.ExchangeDeclare(
		r.Exchange,
		//要改成topic
		"topic",
		true,
		false,
		false,
		false,
		nil,
	)
	r.failOnErr(err, "Failed to declare an exchange!")

	//2.发送消息
	err = r.channel.Publish(
		r.Exchange,
		//要设置
		r.key,
		false,
		false,
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(message),
		})
}

3.话题模式接收消息

//要注意key规则
//其中"*"用于匹配一个单词,"#"用于匹配多个单词(可以是零个)
//匹配test.*表示匹配test.hello,但是test.hello.one需要用test.#才能匹配到
func (r *RabbitMQ) ReceiveTopic() {
	//1.试探性创建交换机
	err := r.channel.ExchangeDeclare(
		r.Exchange,
		//交换机类型
		"topic",
		true,
		false,
		//true表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定
		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 exchange!")

	//3.绑定队列到exchange中
	err = r.channel.QueueBind(
		q.Name,
		//需要绑定key
		r.key,
		r.Exchange,
		false,
		nil,
	)

	//4.消费消息
	messages, err := r.channel.Consume(
		q.Name,
		"",
		true,
		false,
		false,
		false,
		nil,
	)

	forever := make(chan bool)

	go func() {
		for d := range messages {
			log.Printf("Received a message :%s", d.Body)
		}
	}()

	fmt.Println("[*] Waiting for messages,To exit press CTRL+C")
	<-forever
}

4.测试代码

  • Publish
package main

import (
	"fmt"
	"go-rabbitmq/RabbitMQ"
	"strconv"
	"time"
)

func main() {
	testOne := RabbitMQ.NewRabbitMQTopic("exTestTopic", "test.topic.one")
	testTwo := RabbitMQ.NewRabbitMQTopic("exTestTopic", "test.topic.two")
	for i := 0; i <= 10; i++ {
		testOne.PublishTopic("Hello test topic one:" + strconv.Itoa(i))
		testTwo.PublishTopic("Hello test topic two:" + strconv.Itoa(i))
		time.Sleep(time.Second)
		fmt.Println("publish:", i)
	}
}
  • ReceiveAll
package main

import "go-rabbitmq/RabbitMQ"

func main() {
	testOne := RabbitMQ.NewRabbitMQTopic("exTestTopic","#")
	testOne.ReceiveTopic()
}

  • ReveiveOne
package main

import "go-rabbitmq/RabbitMQ"

func main() {
	testOne := RabbitMQ.NewRabbitMQTopic("exTestTopic", "test.*.one")
	testOne.ReceiveTopic()
}

posted @ 2019-11-20 10:31  下了一场大雨  阅读(713)  评论(0编辑  收藏  举报