跳至主内容

Ruby AMQP 0.7 发布!

·5 分钟阅读
Jakub Stastny

我很高兴地宣布 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#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 AMQP 客户端 Puka 的作者,现在您可以使用 URL 而不是选项哈希作为 AMQP.connectAMQP.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/ 目录。非常感谢 arviccomichaelklishin 在此方面的工作!

问题

我们在 tmm1/amqp 存储库中关闭了几乎所有问题。请不要再在那里报告错误,请使用 ruby-amqp/amqp

对贡献者更友好的环境

我们现在使用 bundler,所以如果您想贡献或只是运行测试,只需克隆仓库,运行 bundle install 即可!还有一个 bin/irb 便于调试。

说到这些,我非常感谢所有贡献者,他们的工作确实帮助 AMQP gem 取得了今天的成就。自项目开始以来,已有 22 人为此项目做出贡献,其中 5 人提交了超过 5 次。有关更多详细信息,请查看 CONTRIBUTORS 文件!

AMQP 0.8 的计划

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

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

© . This site is unofficial and not affiliated with VMware.