首页 文章

Clojure - 编译时的连接

提问于
浏览
1

我有一个似乎在编译时启动的rabbitMQ连接(当我输入 lein compile 时),然后阻止我的项目的构建 . 以下是有关此问题的更多详细信息 . 让我们说这是clojure文件 bla_test.clj

(import (com.rabbitmq.client ConnectionFactory Connection Channel QueueingConsumer))

    ;; And then we have to translate the equivalent java hello world program using
    ;; Clojure's excellent interop.

    ;; It feels very strange writing this sort of ceremony-oriented imperative code
    ;; in Clojure:

    ;; Make a connection factory on the local host
    (def connection-factory
         (doto (ConnectionFactory.)
           (.setHost "localhost")))

    ;; and get it to make you a connection
    (def connection (.newConnection connection-factory))

    ;; get that to make you a channel
    (def channel (. connection createChannel))


   ;;HERE I WOULD LIKE TO USE THE SAME CONNECTION AND THE SAME CHANNEL INSTANCE AS OFTEN AS 
   ;; I LIKE
    (dotimes [ i 10 ]
      (. channel basicPublish "" "hello" nil (. (format "Hello World! (%d)" i) getBytes)))

上面的clojure文件是我使用 lein 构建的更大的clojure程序的一部分 . 我的问题是,当我使用"lein compile"进行编译时,由于行 (def connection (.newConnection connection-factory)) 已完成连接,然后编译停止!我怎么能避免这个?有没有 Build 连接编译的方法?如何通过来自外部组件的多个调用设置使用相同的通道实例?

任何帮助,将不胜感激 . 问候,贺拉斯

1 回答

  • 4

    Clojure编译器必须评估所有顶级表单,因为在扩展对宏的调用时可能需要运行任意代码 .

    像你所描述的那样的问题的通常解决方案是定义一个顶层Var,它包含一个可解除引用类型的对象,例如一个原子或一个promise,并且有一个初始化函数在运行时提供该值 . (您也可以使用延迟并指定内联值;这不太灵活,因为它使得使用不同的值进行测试等更加困难)

相关问题