RabbitMQ的路由模式中,一个Exchange只能绑定一个routingKey吗?

不最醉不龟归 发布于 08/17 23:04
阅读 245
收藏 0

用golang模拟RabbitMQ的路由模式的使用,可是发现一个Exchange只能绑定一个routingKey。代码如下:

//生产代码
func main()  {
	by_one := RabbitMQ.NewRabbitMQRouting("ex_routing","by_one")
	by_two := RabbitMQ.NewRabbitMQRouting("ex_routing","by_two")
	for i:= 0;i <= 10;i++{
		by_one.PublishRouting("hello routing one" + strconv.Itoa(i))
		by_two.PublishRouting("hello routing two" + strconv.Itoa(i))
		time.Sleep(1 * time.Second)
		fmt.Println(i)
	}
}

//消费代码1
func main(){
	by_one := RabbitMQ.NewRabbitMQRouting("ex_routing","by_one")
	by_one.RecieveRouting()
}

//消费代码2
func main(){
	by_two := RabbitMQ.NewRabbitMQRouting("ex_routing","by_two")
	by_two.RecieveRouting()
}

程序执行顺序:消费1、消费2、生产,发现消费2没有收到消息。

到RabbitMQ管理界面去把queue中的banding解绑,然后重新按照顺序:消费2、消费1、生产执行,发现消费1没有收到消息。有知道原因的吗?还请指点一二,不胜感激。

 

 

 

 

加载中
0
砒霜鹤顶红
不最醉不龟归
不最醉不龟归
没看明白,能否明示一下,不胜感激
0
qlee
qlee

不清楚你用的那个库实现的,也不太确定你的意思。

只有队列才需要绑定相应的routingkey。

0
不最醉不龟归
不最醉不龟归

引用来自“qlee”的评论

不清楚你用的那个库实现的,也不太确定你的意思。

只有队列才需要绑定相应的routingkey。

刚刚试了一下,不知道为什么突然又可以了。

意图:就是消费端的代码应该输出:

 

用的github.com/streadway/amqp这个库。

相关代码

//url格式 amqp://账户;密码@RabbitMQ服务器地址:端口号/vhost
const MQURL = "amqp://by_name_root:byroot@127.0.0.1:5672/vir_root"

type RabbitMQ struct{
	conn *amqp.Connection
	channel *amqp.Channel
	//队列名词
	QueueName string
	//交换机
	Exchange string
	//key
	Key string
	//连接信息
	Mqurl string
}

//创建RabbitMQ结构体实例
func NewRabbitMQ(queueName,exchange,key string) *RabbitMQ{
	rabbitmq := &RabbitMQ{QueueName:queueName,Exchange:exchange,Key:key,Mqurl:MQURL}
	var err error
	//创建rabbitmq连接
	rabbitmq.conn,err = amqp.Dial(rabbitmq.Mqurl)
	rabbitmq.FailOnErr(err,"创建连接错误!")
	rabbitmq.channel,err = rabbitmq.conn.Channel()
	rabbitmq.FailOnErr(err,"获取channel失败")
	return rabbitmq
}

//断开connection和channel
func (r *RabbitMQ) Destory(){
	r.channel.Close()
	r.conn.Close()
}

func (r *RabbitMQ) FailOnErr(err error,message string){
	if err != nil {
		log.Fatal("%s:%s",message,err)
		panic(fmt.Sprint("%s:%s",message,err))
	}
}

路由模式代码在https://my.oschina.net/bysu/blog/3092864中第四部分

0
山岳之巅
山岳之巅

可以绑定多个,只有消费的时候,如果想做一一绑定,可以一个key对应一个队列

0
-BlueSky-
-BlueSky-

同一个routingKey,当接收到消息时,只能一个队列接收消息其他将不再接收,除非不是同一个routingkey。如果两个队列同一个exchange不同的routingkey的话那么两个队列可同时接收到最新的消息。

返回顶部
顶部