我有我的RabbitMQ实例的两个客户端,但是我无法让Clojure版本正常工作。我可能遗漏了一些RabbitMQ配置,但不知道是什么。我的交换是数据,队列是警报的。
您知道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客户端连接成功,但它没有接收到发送给交换数据/队列“警报”的消息。我没有任何错误信息。
发布于 2016-03-23 15:23:08
在问题的评论中进行了更多的讨论后,以下是您的客户所做的工作:
data直接交换和由服务器自动命名的队列,然后将创建的队列与ALERT路由密钥绑定到data交换。下面是一个模式:
交换:“数据”--“警报”--> queue:$generated_namedata直接交换和ALERT队列,然后用空路由键将创建的队列绑定到data交换。
交换:“数据”--""-->队列:“警报”发布服务器向data交换发送一条消息,其中ALERT作为路由密钥。因此,在情况#1中,消息被正确地路由到队列,而不管其生成的名称如何,因为路由密钥与绑定上的集合匹配。但是,在第2种情况下,由于没有队列绑定到具有匹配路由密钥的data交换,所以删除了消息。
如果要将队列命名为ALERT,并且希望传递带有ALERT路由键的消息,则必须使用"" exchange (其名称为空字符串,路由键指示要使用的队列的名称)或将ALERT队列与ALERT路由键绑定。
https://stackoverflow.com/questions/36094989
复制相似问题