0

我已经定义enqueueMessage了将消息排入rabbitMQ队列的函数。在函数的第一行中,我正在创建通道。这意味着每次我调用enqueueMessage一个频道时都会创建。这是正确的方法还是我应该创建顶级channel变量并重用它?

如果我创建顶级频道,我应该做更多的编码来处理频道因某种原因自动关闭的情况(网络中断)

export async function enqueueMessage(queue: string, message: object) {
  const channel = await connection.createChannel();
  await channel.assertQueue(queue);
  channel.sendToQueue(queue, Buffer.from(JSON.stringify(message)));
}
4

1 回答 1

0

创建一个channel很便宜,但不是那么多。这取决于此方法的调用率。但通常,您应该创建一个顶级channel但要注意它channels不是线程安全的,因此您必须小心。

关于你的下一个问题,是的,你必须处理它。某些客户端库中提供了一些自动恢复选项。例如,在 Java中,您可以使用以下代码:

factory.setAutomaticRecoveryEnabled(true);

根据我的经验,在某些情况下,服务器上的连接会关闭,所以我也必须处理AlreadyClosedException

于 2021-08-25T11:41:40.670 回答