node.js - 无法让 RabbitMQ Clojure 客户端工作

标签 node.js clojure rabbitmq

我的 RabbitMQ 实例有 2 个客户端,但我无法让 Clojure 版本正常工作。我可能缺少一些 RabbitMQ 配置,但不知道是什么。 我的交换是数据,队列是 ALERT。

知道 Clojure 版本中缺少什么吗?

工作 Node.js RabbitMQ 客户端

var amqp = require('amqplib/callback_api');
amqp.connect('amqp://192.168.99.100', function(err, conn) {
  conn.createChannel(function(err, ch) {
  var ex = 'data';
  ch.assertExchange(ex, 'direct', {durable: true});
  ch.assertQueue('', {exclusive: true}, function(err, q) {
    console.log(' [*] Waiting for logs. To exit press CTRL+C');
    ch.bindQueue(q.queue, ex, 'ALERT');
    ch.consume(q.queue, function(msg) {
      console.log(" [x] %s: '%s'", msg.fields.routingKey, msg.content.toString());
    }, {noAck: true});
  });
});

不工作的 Clojure RabbitMQ 客户端

(ns notifications.core
  (:gen-class))
;; Import methods from langohr
(require '[langohr.core      :as rmq]
         '[langohr.channel   :as lch]
         '[langohr.queue     :as lq]
         '[langohr.exchange  :as le]
         '[langohr.consumers :as lc]
         '[langohr.basic     :as lb])

(defn start-consumer
  "Starts a consumer bound to the given topic exchange in a separate thread"
  [ch topic-name]
  (let [queue-name "ALERT"
        handler    (fn [ch {:keys [content-type delivery-tag type] :as meta} ^bytes payload]
                     (println (format "received %s" (String. payload "UTF-8"))))]
    (lq/declare ch queue-name {:exclusive true})
    (lq/bind    ch queue-name topic-name)
    (lc/subscribe ch queue-name handler)))

(defn -main
  "Start RabbitMQ consumer"
  [& args]
  (let [conn  (rmq/connect {:host "192.168.99.100"})
        ch    (lch/open conn)
        ex    "data"]
    (le/declare ch ex "direct" {:durable true})
    (start-consumer ch ex)))

更新

在 RabbitMQ 端,我可以看到 Clojure 客户端连接成功,但没有收到发送到交换数据/队列“ALERT”的消息。我没有任何错误消息。

最佳答案

在问题评论中进行更多讨论后,您的客户将执行以下操作:

  1. 您的 Node.js 客户端创建 data 直接交换和一个由服务器自动命名的队列,然后将创建的队列绑定(bind)到 data 交换ALERT 路由键。这是一个架构:

    exchange:"data" --["ALERT"]--> queue:$generated_name
    
  2. 您的 Clojure 客户端创建 data 直接交换和 ALERT 队列,然后将创建的队列绑定(bind)到 data 交换使用空路由键。

    exchange:"data" --[""]--> queue:"ALERT"
    

您的发布商将消息发送到data 交换,并使用ALERT 作为路由键。因此,在情况 #1 中,消息会正确路由到队列,无论其生成的名称如何,因为路由键与绑定(bind)上设置的路由键匹配。但是,在情况#2 中,消息会被丢弃,因为没有队列与匹配的路由键绑定(bind)到data 交换。

如果您希望将队列命名为 ALERT 并且希望将具有 ALERT 路由键的消息传送到此队列,则必须使用 "" 交换(其名称为空字符串,路由键表示要使用的队列的名称)或将 ALERT 队列与 ALERT 路由键绑定(bind).

关于node.js - 无法让 RabbitMQ Clojure 客户端工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36094989/

相关文章:

javascript - 如何使用Sequelize创建多对多表?

javascript - MEAN 堆栈,我不想使用 Jade,我怎么只使用 HTML

node.js - React-Native 无法解析模块

clojure - 修改 vector 以便可以使用两个参数调用它

clojure - 如何编辑edn文件?

go - 如果没有收到响应,如何使 RabbitMQConsumer 超时

golang rabbitmq channel.consume SIGSEGV

node.js - 无法在 ARMv7 Raspberry pi 上执行 "sudo npm install serialport"

Clojure core.match 无法在类上匹配

kubernetes - Rabbitmq-ha helm chart,管理插件抛出错误