RabbitMQ delayed_message_exchange 声明在 langohr clojure 客户端中失败

RabbitMQ delayed_message_exchange declaration fails in langohr clojure client

我正在尝试按照本文档中的描述配置 RabbitMQ 延迟消息交换:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/

下面是我尝试将 README 中的代码示例翻译成 clojure/langohr。

(let [conn (langohr.core/connect {:host "localhost" :port 61666})
      ch (langohr.channel/open conn)]
  (langohr.exchange/declare ch "my-exchange" "x-delayed-message"
                            {"x-delayed-type" "direct"}))

可悲的是,当我 运行 这个时,我收到这个错误:

ShutdownSignalException channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - Invalid argument, 'x-delayed-type' must be an existing exchange type, class-id=40, method-id=10)  com.rabbitmq.client.impl.ChannelN.asyncShutdown (ChannelN.java:509)

查看 rabbit_exchange_type_delayed_message 插件的源代码,我可以看到我的 {"x-delayed-type" "direct"} 似乎落入了该 case 语句中的默认处理程序。

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/blob/543efef2555338c46f776a89df3ee134066221e2/src/rabbit_exchange_type_delayed_message.erl#L72

我不知道为什么会这样,也不知道如何解决。

看来您需要将选项映射包装在另一个 :arguments 映射中。这里的 langohr.exchange/declare code 显示了使用解构的 arguments 绑定作为映射对 .exchangeDeclare 的调用。

(let [conn (langohr.core/connect {:host "localhost" :port 61666})
      ch (langohr.channel/open conn)]
  (langohr.exchange/declare ch "my-exchange" "x-delayed-message"
                            {:arguments {"x-delayed-type" "direct"}}))