英文:
Can't return *amqp.Channel from a function when using the Go RabbitMQ streadway/amqp driver
问题
我正在尝试使用Go语言的streadway/amqp驱动程序连接到RabbitMQ消息总线。我正在编写一个重新连接的例程,在这个例程中,我有一个rabbitMQConsume
函数调用一个rabbitMQConnect
函数。
问题是,当ch
和conn
从rabbitMQConnect
返回到rabbitMQConsume
时,它们的值为nil
,当我运行ch.Consume
这一行时,程序会发生崩溃。我参考了这个示例。有什么想法吗?谢谢!
英文:
I'm trying to connect to a RabbitMQ bus using the streadway/amqp driver for Go. I'm working on a reconnection routine and, for it, I have a rabbitMQConsume
function call a rabbitMQConnect
function.
func rabbitMQConnect(cfg objects.GlobalConfig) (*amqp.Connection, *amqp.Channel, error) {
rabbitConfig := amqp.Config{
Vhost: cfg.RabbitVHost,
Heartbeat: 5,
}
//Open connection to Rabbit
url := fmt.Sprintf("amqp://" + cfg.RabbitUser + ":" + cfg.RabbitPassword + "@" + cfg.RabbitHost + ":" + cfg.RabbitPort + cfg.RabbitVHost)
conn, err := amqp.DialConfig(url, rabbitConfig)
if err == nil {
return nil, nil, err
}
ch, err := conn.Channel()
if err != nil {
return nil, nil, err
}
// Create Exchange if it doesn't exist
err = ch.ExchangeDeclare(
"ali", // name
"direct", // type
true, // durable
false, // auto-deleted
false, // internal
false, // no-wait
nil, // arguments
)
if err != nil {
return nil, nil, err
}
//Declare queue
_, err = ch.QueueDeclare(
cfg.RabbitQueue, // name
true, // durable
false, // delete when usused
false, // exclusive
false, // no-wait
nil, // arguments
)
if err != nil {
return nil, nil, err
}
//Bind queue
err = ch.QueueBind(
cfg.RabbitQueue, // queue name
cfg.RabbitKey, // routing key
cfg.RabbitExchange, // exchange
false,
nil,
)
if err != nil {
return nil, nil, err
}
return conn, ch, nil
}
//RabbitMQConsume setup the channel/exchange data
func rabbitMQConsume(cfg objects.GlobalConfig) (*amqp.Connection, <-chan amqp.Delivery, error) {
conn, ch, err := rabbitMQConnect(cfg)
if err != nil {
return nil, nil, err
}
consumerID, err := helper.GetConsumerID()
if err != nil {
return nil, nil, err
}
//Start receiving data in the msgs channel
msgs, err := ch.Consume(
cfg.RabbitQueue, // queue
consumerID, // consumer
false, // auto-ack
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
if err != nil {
return nil, nil, err
}
return conn, msgs, nil
}
The problem I'm having is that the value of ch
and conn
when they're returned to rabbitMQConsume
from rabbitMQconnect
, are nil
and the program panics when I run the ch.Consume
line.
I'm losely basing this on this example
Any ideas? Thanks!
答案1
得分: 1
在amqp.DialConfig
之后的错误检查中,你有一个拼写错误!
将err == nil
更改为err != nil
conn, err := amqp.DialConfig(url, rabbitConfig)
if err != nil { // 你将其写成了 err == nil
return nil, nil, err
}
请注意,这是你要翻译的内容。
英文:
You have a typo in your error checking after amqp.DialConfig
!
Change the err == nil
to err != nil
conn, err := amqp.DialConfig(url, rabbitConfig)
if err != nil { // you typed it as err == nil
return nil, nil, err
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论