Ruby AMQP 0.7 发布!
我很高兴地宣布 AMQP 0.7 发布了,正如我在上一篇博文中承诺的那样。那么,有什么变化呢?

当您安装 AMQP gem 时,您将看到当前版本的变化。(我是如何做到的?通过changelog gem 和一点gemspec 魔术。)
MQ#queue 的回调
Queue.Declare/Queue.Declare-Ok 请求/响应的同步 API 通过异步回调暴露
channel = MQ.new
fanout = channel.fanout(:task_fanout)
channel.queue(:tasks) do |queue, message_count, consumer_count|
puts "Queue #{queue.name} declared!"
puts "Message count: #{message_count}"
puts "Consumer count: #{consumer_count}"
end
MQ#queues 和 MQ#exchanges 中的自动命名队列和匿名实体不被重写
如果队列的声明名称为空,则代理应生成随机名称。在早期版本的 Ruby AMQP 中,这不受支持,因为缺少同步 API(等待 Queue.Declare-Ok)。现在不再是这样了。
channel = MQ.new
channel.queue("") do |queue|
puts "Queue with name #{queue.name} declared!"
end
# OUTPUT: Queue with name amq.gen-PfCGdyBA4Sr4rkZg3IN3Kw== declared!
同样的情况也应该适用于交换器,但当前版本的 RabbitMQ 不支持这一点。
此外,在以前的 AMQP 版本中,MQ#queues、MQ#exchanges 等只是一个哈希表,因此如果给定的实体是匿名的(名称为 nil),并且如果集合已包含另一个匿名实例,那么已在该集合中的实例将被重写。
MQ::Queue#bind 的回调
MQ::Queue#bind 现在可以接受一个回调,就像 MQ#queue 一样。
channel = MQ.new
fanout = channel.fanout(:task_fanout)
channel.queue(:tasks).bind(fanout) do |queue|
puts "Queue #{queue.name} was bound!"
end
AMQP URL
感谢 majek,他是 Python AMQP 客户端 Puka 的作者,现在您可以使用 URL 而不是选项哈希作为 AMQP.connect 和 AMQP.start 的参数。
AMQP.start("amqps:/")
# Will resolve to: {vhost: "/", port: 5671, ssl: true}
AMQP.start("amqp://botanicus@localhost:1111/")
# Will resolve to: {user: "botanicus", vhost: "/", host: "localhost", port: 1111, ssl: false}
MQ::Exchange.default
默认交换器是一个名称为空的直接交换器,所有队列都会自动绑定到它(您无法手动绑定任何内容)。请勿将默认交换器与 amq.direct 混淆,后者仅是一个没有“魔法”功能的预定义直接交换器。
如果实体以不同的选项重新声明,则失败
与其等待服务器,不如如果我们可以在客户端处理,让其失败,这样用户就能获得更具描述性的错误消息。
channel = MQ.new
channel.queue(:tasks, auto_delete: true)
channel.queue(:tasks, auto_delete: false)
# Exception: There is already an instance called tasks with options
{:queue => :tasks, :nowait => true, :auto_delete => true},
you can't define the same instance with different options ({:queue => :tasks,
:nowait => true, :auto_delete => false})! (MQ::IncompatibleOptionsError)
如果凭据无效,则不重新连接
如果连接失败,AMQP 会自动重新连接。即使出现提供无效凭据等错误,它也会尝试重新连接。我已经将其更改为在连接实际建立后才注册重新连接钩子,因此无论出于何种原因连接失败,它都不会尝试重新连接。
rSpec 2 测试
这仍在进行中,您可以查看spec/ 目录。非常感谢 arvicco 和 michaelklishin 在此方面的工作!
问题
我们在 tmm1/amqp 存储库中关闭了几乎所有问题。请不要再在那里报告错误,请使用 ruby-amqp/amqp。
对贡献者更友好的环境
我们现在使用 bundler,所以如果您想贡献或只是运行测试,只需克隆仓库,运行 bundle install 即可!还有一个 bin/irb 便于调试。
说到这些,我非常感谢所有贡献者,他们的工作确实帮助 AMQP gem 取得了今天的成就。自项目开始以来,已有 22 人为此项目做出贡献,其中 5 人提交了超过 5 次。有关更多详细信息,请查看 CONTRIBUTORS 文件!
AMQP 0.8 的计划
下一个 0.8 版本将带来一些重大的 API 更改:将不再有两个独立的常量 MQ 和 AMQP,而只有一个 AMQP。MQ 类将变为 AMQP::Channel,这样我们将符合官方 AMQP 术语,并且我们还希望通过 AMQ-Protocol gem 引入对 AMQP 0.9.1 的支持。
链接
有任何意见或想法?随时欢迎您光临 Jabber MUC amqp-dev@conf.netlab.cz,并告诉我们您的想法!