如何重置延迟交换rabbimq(如果它已经存在)

时间:2018-04-06 11:47:53

标签: javascript node.js ecmascript-6 rabbitmq rabbitmq-exchange

我正在尝试检查当前交换是否存在,如果存在,我想删除并再次创建。当我不使用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)
    }

}

1 个答案:

答案 0 :(得分:0)

RabbitMQ中的交换声明是自信的。这意味着您运行一个声明交换存在的语句,如果交换不存在,那么它将在那时创建。如果交换已经存在,那么将会发生以下两种情况之一:

  1. 如果使用不同的属性重新声明它,您将收到一个通道错误,该错误由消息后跟通道关闭指示。这就是处理RabbitMQ中大多数错误的方法。因此,您的客户需要优雅地处理(在我看来,为此提出例外将是对例外的不当使用)。

  2. 如果使用与之前相同的参数重新声明它,则不会执行任何操作;该频道将保持开放状态并按原样使用。

  3. 编辑:我不知道有太多有效的用例,我想要定期删除和重新声明交换。我认为交换是代理的静态配置的一部分。交换配置的更改通常最好在应用程序部署时完成。