rabbiMQ可能需要注意的地方

1. rabbiMQ队列中的exclusive属性

当已经在一个连接中把队列A的exclusive设置为true,如果此时再创建队列A就会失败。

测试例子:

package main
import (
	"fmt"
	amqp "github.com/rabbitmq/amqp091-go"
)

//发布者的信道,用于发布消息
var publisherCh *amqp.Channel
const (
	MQURL = "192.168.45.3:5672"
	MQUSER = "admin"
	MQPASSWORD = "admin"
)

func main(){
	go InitConsumer()
	go InitPublisher()
	var msg string
	for{
		fmt.Println("input something...")
		fmt.Scanf("%s", &msg)
		if msg != ""{
			PublishMsg(msg)
		}
	}

}

//获取连接uri
func GetMQUri() string {
	return fmt.Sprintf("amqp://%s:%s@%s/", MQUSER, MQPASSWORD, MQURL)
}


//初始化发送者
func InitPublisher(){
	//1. 建立链接
	con, err := amqp.Dial(GetMQUri())
	if err != nil{
		fmt.Println(err)
		return
	}

	//2. 创建信道
	ch, err := con.Channel()
	if err != nil{
		fmt.Println(err)
		return
	}

	publisherCh = ch
}

func PublishMsg(msg string){
	if publisherCh == nil{
		fmt.Println("no mq connection")
		return
	}
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	publisherCh.PublishWithContext(
		ctx,
		"",
		"exclusive_queue",
		false,
		false,
		amqp.Publishing{
			Body: []byte(msg),
			Type: "text/plain"})
	fmt.Println("publish--->", msg)
}


//初始化消费者
func InitConsumer(){
	//1. 建立链接
	fmt.Println(_const.GetMQUri())
	con, err := amqp.Dial(_const.GetMQUri())
	if err != nil{
		fmt.Println("dial rabbit mq error->", err)
		return
	}

	//2. 创建信道
	ch, err := con.Channel()
	if err != nil{
		fmt.Println(err)
		return
	}

	//3. 创建exclusive队列
	q, err := ch.QueueDeclare(
		"exclusive_queue",
		false,
		false,
		true, //exclusive
		false,
		nil)
	if err != nil{
		fmt.Println(err)
		return
	}

	//4. 接受消息
	msgs, err := ch.Consume(
		q.Name,
		fmt.Sprintf("%d", time.Now().Unix()),
		true,
		false,
		false,
		false,
		nil)
	if err != nil{
		fmt.Println(err)
		return
	}

	forever := make(chan interface{})
	go func() {
		for msg := range msgs{
			fmt.Println("receive--->", string(msg.Body))
		}
	}()
	<-forever
}

执行代码一次,在不关闭第一个进程的同时,再次执行这个代码(如果使用的时Goland,在Edit Configurations中选择All Parallel run)
结果:给出了错误原因,这个队列已经在其他连接中声明了或者在之前的声明中这个队列并没有exclusive属性(如果是第二种错误,删掉原来的队列就可以,但我们的错误原因显然是第一种,由于声明了exclusive属性,在一个连接中已经声明了队列的情况下,就不能再次创建这个队列了)

Exception (405) Reason: "RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'exclusive_queue' in vhost '/'. It could be originally declared on another connection or the exclusive property value does not match that of the original declaration."
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值