不能有RabbitMQ Clojure客户端工作

我有我的RabbitMQ实例的2个客户端,但我没有设法使Clojure版本工作。 我可能错过了一些RabbitMQconfiguration,但无法弄清楚什么。 我的交换是数据,队列是警报。

任何想法在Clojure版本中缺less什么?

工作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客户端创builddata直接交换和服务器自动命名的队列,然后使用ALERT路由密钥将创build的队列绑定到data交换。 这是一个模式:

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

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

您的发布者将消息发送到data交换,并将ALERT作为路由密钥。 因此,在情况#1中,由于路由密钥与绑定上设置的路由密钥匹配,所以消息被正确路由到队列,而不pipe其生成的名称。 但是,在情况#2中,由于没有与具有匹配的路由密钥的data交换绑定的队列,所以丢弃该消息。

如果您希望将队列命名为ALERT并且希望将具有ALERT路由键的消息传递到ALERT ,则必须使用""交换(其名称是空string,路由键指示队列的名称以使用)或使用ALERT路由密钥绑定ALERT队列。