我正在尝试检查当前交换是否存在,如果存在,我想删除并再次创建。当我不使用try catch
并尝试删除不存在的交换时我丢失了连接并得到错误,如果在我尝试删除后不存在,如何创建索引?
export const resetDelayedExchange = (connection ,expectedMessages) => async (message, type) => {
const exchange = getExchange(type)
const channel = await connection.createChannel()
const cleanupDelayedExchange = `${exchange}.${delayedExchange}`
const restoreOnFailure = e => {
channel.assertExchange(cleanupDelayedExchange, delayedExchangeType, {durable: true, arguments: {[delayedMessageType]: 'direct'}})
channel.bindExchange(exchange, cleanupDelayedExchange)
logger.silly(`publishing message to ${cleanupDelayedExchange}`)
channel.publish(cleanupDelayedExchange, '', expectedMessages[type].encode(message).finish(), headerArg)
}
try {
channel.deleteExchange(cleanupDelayedExchange, {ifUnused : false})
connection.on('error', restoreOnFailure)
} catch (error) {
restoreOnFailure(error)
}
}
答案 0 :(得分:0)
RabbitMQ中的交换声明是自信的。这意味着您运行一个声明交换存在的语句,如果交换不存在,那么它将在那时创建。如果交换已经存在,那么将会发生以下两种情况之一:
如果使用不同的属性重新声明它,您将收到一个通道错误,该错误由消息后跟通道关闭指示。这就是处理RabbitMQ中大多数错误的方法。因此,您的客户需要优雅地处理(在我看来,为此提出例外将是对例外的不当使用)。
如果使用与之前相同的参数重新声明它,则不会执行任何操作;该频道将保持开放状态并按原样使用。
编辑:我不知道有太多有效的用例,我想要定期删除和重新声明交换。我认为交换是代理的静态配置的一部分。交换配置的更改通常最好在应用程序部署时完成。