我试图将RabbitMQ交互存根,因为那些并不是我正在编写的应用程序的主要目的.
所以,我尝试在我的测试中重新绑定langohr函数,如下所示:
(defn stub [ch]
(langohr.basic/ack ch 1))
(deftest test-stub
(with-redefs [langohr.basic/ack (fn [a1 a2] true)]
(is (= true (stub "dummy")))))
Run Code Online (Sandbox Code Playgroud)
当我运行测试时lein test,我得到了一个
java.lang.ClassCastException:
redwood.env_test$fn__2210$fn__2211 cannot be cast to clojure.lang.IFn$OLO
Run Code Online (Sandbox Code Playgroud)
我一直在尝试其他几种方法,包括不同的测试框架来重新定义或重新绑定langohr lib函数而没有任何进展.
我已经测试了其他场景,并且我已经使用上面的代码结构成功地将cheshire(json解析clojure lib)函数存根.我谦恭地理解为什么我的langohr存根不工作以及我如何能在一个优雅的方式做到这一点的提示请求援助.
我们有Clojure代码,它从Rabbit队列中读取.我们想要容忍RabbitMQ服务器短暂停机的情况,例如在重启(sudo service rabbitmq-server restart)的情况下.
在Langohr 似乎有一些重新连接的规定.我们改编了这个例子clojurewerkz.langohr.examples.recovery.example1(Gist here).与已发布的示例相比,略有差异包括连接参数和lb/publish调用的删除(因为我们使用外部源填充数据).
我们可以成功使用队列中的数据并等待更多消息.但是,当我们重新启动RMQ时(通过sudo托管RabbitMQ的VM 上的上述命令),抛出以下异常:
Caught an exception during connection recovery!
java.io.IOException
at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:106)
at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:102)
at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:378)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:516)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:545)
at com.novemberain.langohr.Connection.recoverConnection(Connection.java:166)
at com.novemberain.langohr.Connection.beginAutomaticRecovery(Connection.java:115)
at com.novemberain.langohr.Connection.access$000(Connection.java:18)
at com.novemberain.langohr.Connection$1.shutdownCompleted(Connection.java:93)
at com.rabbitmq.client.impl.ShutdownNotifierComponent.notifyListeners(ShutdownNotifierComponent.java:75)
at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:573)
Caused by: com.rabbitmq.client.ShutdownSignalException: connection error; reason: java.io.EOFException
at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:67)
at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:33)
at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:343)
at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:321)
... 8 more
Caused by: java.io.EOFException
at java.io.DataInputStream.readUnsignedByte(DataInputStream.java:273)
at com.rabbitmq.client.impl.Frame.readFrom(Frame.java:95)
at com.rabbitmq.client.impl.SocketFrameHandler.readFrame(SocketFrameHandler.java:131)
at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:533)
Run Code Online (Sandbox Code Playgroud)
Langohr提供的预期重启机制似乎很可能在它启动时破坏.在这些"硬"重启的情况下,是否存在替代模式?或者,我想我们必须实现连接监视并重试自己.任何建议都是最受欢迎的.