英文:
Go amqp method to list all currently declared queues?
问题
我正在使用streadway/amqp库将RabbitMQ与我们的警报系统进行连接。我需要一个方法,可以返回当前声明的所有队列的列表(如果能返回交换机也不错!),这样我就可以遍历并获取所有消息的计数。
我正在查阅这里的API文档...
http://godoc.org/github.com/streadway/amqp#Queue
...但是我似乎找不到我要找的内容。我们目前使用一个bash调用'rabbitmqctl list_queues'来获取这些信息,但这是一种笨拙的方式,需要自定义sudo设置,并且每天会触发数百条日志记录到安全日志中。
编辑:方法指的是“获取这个信息的方式”,而不是一个实际的调用,尽管一个调用会很好,但我不认为这样的调用存在。
英文:
I'm using streadway/amqp to do a tie in from rabbitmq to our alert system. I need a method that can return a list of all the currently declared queues (exchanges would be nice too!) so that I can go through and get all the message counts.
I'm digging through the api documentation here...
http://godoc.org/github.com/streadway/amqp#Queue
...but I don't seem to be finding what I'm looking for. We're currently using a bash call to 'rabbitmqctl list_queues' but that's a kludge way to get this information, requires a custom sudo setting, and fires off hundreds of log entries a day to the secure log.
edit: method meaning, 'a way to get this piece of information' as opposed to an actual call, though a call would be great I don't believe it exists.
答案1
得分: 11
回答了自己的问题。没有办法!AMQP规范没有一种标准的方法来找到这个信息,这对我来说似乎是一个明显的疏忽。然而,由于我的后端是带有管理插件的RabbitMQ,我可以调用该插件来获取这些信息。
从https://stackoverflow.com/a/21286370/5076297(使用Python,我只需要翻译这个并且可能还要找出获取虚拟主机的调用):
import requests
def rest_queue_list(user='guest', password='guest', host='localhost', port=15672, virtual_host=None):
url = 'http://%s:%s/api/queues/%s' % (host, port, virtual_host or '')
response = requests.get(url, auth=(user, password))
queues = [q['name'] for q in response.json()]
return queues
在Go语言中(这让我头疼了一阵,因为我多年没有使用结构体了):
package main
import (
"fmt"
"net/http"
"encoding/json"
)
func main() {
type Queue struct {
Name string `json:name`
VHost string `json:vhost`
}
manager := "http://127.0.0.1:15672/api/queues/"
client := &http.Client{}
req, _ := http.NewRequest("GET", manager, nil)
req.SetBasicAuth("guest", "guest")
resp, _ := client.Do(req)
value := make([]Queue, 0)
json.NewDecoder(resp.Body).Decode(&value)
fmt.Println(value)
}
输出结果如下(我有两个名为hello和test的队列):
[{hello /} {test /}]
英文:
Answered my own question. There isn't a way! The amqp spec doesn't have a standard way of finding this out which seems like a glaring oversight to me. However, since my backend is rabbitmq with the management plugin, I can make a call to that to get this information.
from https://stackoverflow.com/a/21286370/5076297 (in python, I'll just have to translate this and probably also figure out the call to get vhosts):
import requests
def rest_queue_list(user='guest', password='guest', host='localhost', port=15672, virtual_host=None):
url = 'http://%s:%s/api/queues/%s' % (host, port, virtual_host or '')
response = requests.get(url, auth=(user, password))
queues = [q['name'] for q in response.json()]
return queues
edit: In golang (this was a headache to figure out as I haven't done anything with structures in years)
package main
import (
"fmt"
"net/http"
"encoding/json"
)
func main() {
type Queue struct {
Name string `json:name`
VHost string `json:vhost`
}
manager := "http://127.0.0.1:15672/api/queues/"
client := &http.Client{}
req, _ := http.NewRequest("GET", manager, nil)
req.SetBasicAuth("guest", "guest")
resp, _ := client.Do(req)
value := make([]Queue, 0)
json.NewDecoder(resp.Body).Decode(&value)
fmt.Println(value)
}
Output looks like this (I have two queues named hello and test)
[{hello /} {test /}]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论