首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法让RabbitMQ Clojure客户端工作

无法让RabbitMQ Clojure客户端工作
EN

Stack Overflow用户
提问于 2016-03-18 22:05:27
回答 1查看 90关注 0票数 2

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

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

工作Node.js RabbitMQ客户端

代码语言:javascript
复制
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客户端

代码语言:javascript
复制
(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客户端连接成功,但它没有接收到发送给交换数据/队列“警报”的消息。我没有任何错误信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-23 15:23:08

在问题的评论中进行了更多的讨论后,以下是您的客户所做的工作:

  1. 您的Node.js客户端创建data直接交换和由服务器自动命名的队列,然后将创建的队列与ALERT路由密钥绑定到data交换。下面是一个模式: 交换:“数据”--“警报”--> queue:$generated_name
  2. 您的Clojure客户端创建data直接交换和ALERT队列,然后用空路由键将创建的队列绑定到data交换。 交换:“数据”--""-->队列:“警报”

发布服务器向data交换发送一条消息,其中ALERT作为路由密钥。因此,在情况#1中,消息被正确地路由到队列,而不管其生成的名称如何,因为路由密钥与绑定上的集合匹配。但是,在第2种情况下,由于没有队列绑定到具有匹配路由密钥的data交换,所以删除了消息。

如果要将队列命名为ALERT,并且希望传递带有ALERT路由键的消息,则必须使用"" exchange (其名称为空字符串,路由键指示要使用的队列的名称)或将ALERT队列与ALERT路由键绑定。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36094989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档