跳到主要内容

Ruby AMQP 0.7 发布了!

·4 分钟阅读
Jakub Stastny

我很高兴地宣布 AMQP 0.7 发布了,正如我在之前的博客文章中承诺的那样。那么有哪些变化呢?

当您安装 AMQP gem 时,您会看到当前版本的更改。(我是怎么做到的呢?通过 changelog gem 和一点 gemspec magic。)

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 中的匿名实体

如果队列声明时名称为空,broker 应该生成随机名称。在之前的 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!

同样的情况应该适用于 exchanges,但这在当前版本的 RabbitMQ 中不受支持。

此外,在之前的 AMQP 版本中,MQ#queuesMQ#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 的 Puka AMQP 客户端的作者,您可以使用 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

默认 exchange 是一个空名称的 direct exchange,其中所有队列都自动绑定(并且您无法在那里手动绑定任何内容)。不要将默认 exchange 与 amq.direct 混淆,后者只是一个预定义的 direct exchange,没有任何“魔法”能力)。

如果实体使用不同的选项重新声明则失败

与其等待服务器,不如尽可能让客户端失败,这样用户可以获得更具描述性的错误消息

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/ 目录。非常感谢 arviccomichaelklishin 在这方面的工作!

问题

我们关闭了 tmm1/amqp 仓库中的几乎所有问题。请不要在那里报告任何进一步的错误,请使用 ruby-amqp/amqp

对贡献者更友好的环境

我们现在使用 bundler,因此如果您想贡献或只是运行测试,只需克隆 repo,运行 bundle install,就可以了!还有 bin/irb 用于更轻松的调试。

说到他们,我真的要感谢所有的贡献者,他们的工作真的帮助 AMQP gem 达到了现在的水平。自开始以来,有 22 人为该项目做出了贡献,其中 5 人提交了 5 次以上的 commits。查看 CONTRIBUTORS 文件以获取更多详细信息!

AMQP 0.8 的计划

下一个 0.8 版本将带来一些重大的 API 更改:不会有两个单独的常量 MQAMQP,而只会保留第二个。MQ 类将变为 AMQP::Channel,因此我们将符合官方 AMQP 术语,并且我们还希望通过 AMQ-Protocol gem 引入 对 AMQP 0.9.1 的支持

有任何意见或想法吗?随时欢迎访问 Jabber MUC amqp-dev@conf.netlab.cz,并告诉我们您的想法!

© . All rights reserved.