我有一个设置,可以将消息从服务器(NodeJS)发送到持久队列,客户端(Android应用程序)侦听各自队列上的消息(每个Android设备侦听其对应的唯一队列)。
根据 RabbitMQ 文档,当我们尝试连接到名称为空(即“”)的队列时,RabbitMQ 会生成一个名称以“amq.gen-”开头的随机队列。但是,从客户端或服务器代码中我没有看到我正在尝试连接到具有空名称的队列,但仍然看到生成了很多随机队列。
任何人都可以帮助我理解哪些其他场景可能会创建名为“amq.gen-*”的随机队列?
如果您使用空白名称创建队列,则会生成随机队列名称
amq.gen-*
。
如果您使用空白名称连接到队列,则根据方法,将使用在此通道上最后声明的队列名称。如果没有声明队列或者方法不支持空白队列名称错误,将会抛出错误。
queue.declare
方法 和 domain.queue-name
域 文档。
RabbitMq 生成随机名称队列(amq.gen-* ),如果在应用程序中您将空字符串作为队列名称传递,请检查 RabbitMq 配置。
如果您使用 amqpl lib,并使用 null 或空的随机名称创建队列,并将名称分配给队列。像这样的 amq.gen--xxxxxx
要简单地删除这些队列,您可以使用 Management API,使用 HTTP 请求。
我还创建了一个用于重用的存储库 :: GITHUB REPO
const deleteRabbitMQQueues = async (rabbitMQHost, username, password) => {
try {
// Encode credentials for Basic Auth
const auth = Buffer.from(`${username}:${password}`).toString("base64");
// Get the list of all queues
const response = await axios.get(`https://${rabbitMQHost}/api/queues`, {
headers: {
Authorization: `Basic ${auth}`,
},
});
const queues = response.data;
console.log(`Found total queues : ${queues.length}`);
// Filter queues that start with 'amq.gen--'
const queuesToDelete = queues.filter((queue) =>
queue.name.startsWith("amq.gen-"),
);
console.log(`Found queues to delte : ${queuesToDelete.length}`);
for (const queue of queuesToDelete) {
try {
console.log(`Deleting queue: ${queue.name}`);
// Delete the queue
await axios.delete(
`https://${rabbitMQHost}/api/queues/%2F/${encodeURIComponent(queue.name)}`,
{
headers: {
Authorization: `Basic ${auth}`,
},
},
);
} catch (error) {
console.error(`Failed to delete queue: ${queue.name}`, error);
}
}
} catch (error) {
console.error("Error fetching or deleting queues:", error);
}
};