我正在浏览他们网页上的 RabbitMQ 教程,作为练习,我试图重构他们提供的示例,以使它们更加通用和可组合。我被困在第二个“blabbr”示例上。这是我要重构的功能:
(defn -main
[& args]
(let [conn (rmq/connect)
ch (lch/open conn)
ex "nba.scores"
users ["joe" "aaron" "bob"]]
(le/declare ch ex "fanout" :durable false :auto-delete true)
(doseq [u users]
(start-consumer ch ex u))
(lb/publish ch ex "" "BOS 101, NYK 89" :content-type "text/plain" :type "scores.update")
(lb/publish ch ex "" "ORL 85, ALT 88" :content-type "text/plain" :type "scores.update")
(Thread/sleep 2000)
(rmq/close ch)
(rmq/close conn)))
我以为我可以制作一个宏并在函数中调用它,如下所示:
(defmacro wrap-publish [default-exchange-name content mType data]
`(for [datum# data]
(lb/publish ch ex default-exchange-name datum# :content-type ~content :type ~mType)))
(defn -main
[...]
...
(wrap-publish default-exchange-name content-type mType data)
...
wrap-publish
但是,当我在 repl 上单独测试宏时,出现此错误:
java.lang.ClassCastException: clojure.lang.Var$Unbound cannot be cast to` com.novemberain.langohr.Channel basic.clj:89 langohr.basic/publish
似乎有一些全球性的事情不会让我绑定我的变量,但我不知道是什么。我顺着鼻子找到了从堆栈跟踪中扔给我的源代码 ,并在那里遇到了死胡同。我只是不知道该怎么办。我是一名新程序员,正在逐步进入异步和宏的世界。因此,我将不胜感激任何建议,这些建议不仅可以帮助我实现目标,还可以提供一般见解,这些见解将告知我的基本技能,并让我知道我是否采取了正确的方法。我正在使用 langohr 依赖项 [com.novemberain/langohr "2.9.0"]。