不能有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”的消息。 我没有任何错误消息。
经过问题评论的更多讨论,以下是你的客户所做的事情:
-
Node.js客户端创build
data
直接交换和服务器自动命名的队列,然后使用ALERT
路由密钥将创build的队列绑定到data
交换。 这是一个模式:exchange:"data" --["ALERT"]--> queue:$generated_name
-
您的Clojure客户端创build
data
直接交换和ALERT
队列,然后使用空的路由密钥将创build的队列绑定到data
交换。exchange:"data" --[""]--> queue:"ALERT"
您的发布者将消息发送到data
交换,并将ALERT
作为路由密钥。 因此,在情况#1中,由于路由密钥与绑定上设置的路由密钥匹配,所以消息被正确路由到队列,而不pipe其生成的名称。 但是,在情况#2中,由于没有与具有匹配的路由密钥的data
交换绑定的队列,所以丢弃该消息。
如果您希望将队列命名为ALERT
并且希望将具有ALERT
路由键的消息传递到ALERT
,则必须使用""
交换(其名称是空string,路由键指示队列的名称以使用)或使用ALERT
路由密钥绑定ALERT
队列。