Ruby AMQP 0.7 发布了!
我很高兴地宣布 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#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 的 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/ 目录。非常感谢 arvicco 和 michaelklishin 在这方面的工作!
问题
我们关闭了 tmm1/amqp 仓库中的几乎所有问题。请不要在那里报告任何进一步的错误,请使用 ruby-amqp/amqp。
对贡献者更友好的环境
我们现在使用 bundler,因此如果您想贡献或只是运行测试,只需克隆 repo,运行 bundle install
,就可以了!还有 bin/irb
用于更轻松的调试。
说到他们,我真的要感谢所有的贡献者,他们的工作真的帮助 AMQP gem 达到了现在的水平。自开始以来,有 22 人为该项目做出了贡献,其中 5 人提交了 5 次以上的 commits。查看 CONTRIBUTORS 文件以获取更多详细信息!
AMQP 0.8 的计划
下一个 0.8 版本将带来一些重大的 API 更改:不会有两个单独的常量 MQ
和 AMQP
,而只会保留第二个。MQ
类将变为 AMQP::Channel
,因此我们将符合官方 AMQP 术语,并且我们还希望通过 AMQ-Protocol gem 引入 对 AMQP 0.9.1 的支持。
链接
有任何意见或想法吗?随时欢迎访问 Jabber MUC amqp-dev@conf.netlab.cz,并告诉我们您的想法!