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."