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 的 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
默认交换机是一个直接交换机,名称为空,所有队列都会自动绑定到它(并且你不能手动绑定任何东西)。不要将默认交换机与 amq.direct
混淆,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,并告诉我们你的想法!