【问题标题】:How to reset Delay exchange rabbimq if it's already exist如果它已经存在,如何重置延迟交换rabbitmq
【发布时间】:2018-04-06 11:47:53
【问题描述】:

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

}

【问题讨论】:

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


    【解决方案1】:

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

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

    2. 如果重新声明了和之前一样的参数,则不做任何动作;该频道将保持打开状态并按原样使用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 2014-05-03
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 2011-01-18
      相关资源
      最近更新 更多