“server”应用程序具有基于rubyamqp.info documentation中的请求/回复模式的config / initializers / amqp.rb文件:
require "amqp"EventMachine.next_tick do connection = AMQP.connect ENV['CLOUdamQP_URL'] || 'amqp://guest:guest@localhost' channel = AMQP::Channel.new(connection) requests_queue = channel.queue("amqpgem.examples.services.time",:exclusive => true,:auto_delete => true) requests_queue.subscribe(:ack => true) do |Metadata,payload| puts "[requests] Got a request #{Metadata.message_ID}. Sending a reply..." channel.default_exchange.publish(Time.Now.to_s,:routing_key => Metadata.reply_to,:correlation_ID => Metadata.message_ID,:mandatory => true) Metadata.ack end Signal.trap("INT") { connection.close { EventMachine.stop } }end
在“客户端”应用程序中,我想在视图中将同步调用的结果呈现给“服务器”.我意识到这有点像amqp gem这样的固有异步库的舒适区域,但我想知道是否有办法让它工作.这是我的客户端config / initializers / amqp.rb:
require 'amqp'EventMachine.next_tick do AMQP.connection = AMQP.connect 'amqp://guest:guest@localhost' Signal.trap("INT") { AMQP.connection.close { EventMachine.stop } }end
这是控制器:
require "amqp"class WelcomeController < ApplicationController def index puts "[request] Sending a request..." WelcomeController.channel.default_exchange.publish("get.time",:routing_key => "amqpgem.examples.services.time",:message_ID => Kernel.rand(10101010).to_s,:reply_to => WelcomeController.replIEs_queue.name) WelcomeController.replIEs_queue.subscribe do |Metadata,payload| puts "[response] Response for #{Metadata.correlation_ID}: #{payload.inspect}" @message = payload.inspect end end def self.channel @channel ||= AMQP::Channel.new(AMQP.connection) end def self.replIEs_queue @replIEs_queue ||= channel.queue("reply",:auto_delete => true) endend
当我在不同的端口上启动两个应用程序并访问welcome #index视图时.
@message在视图中为零,因为结果尚未返回.结果在渲染视图后几毫秒到达并显示在控制台上:
$thin start>> Using rack adapter>> Thin web server (v1.5.0 codename Knife)>> Maximum connections set to 1024>> Listening on 0.0.0.0:3000,CTRL+C to stop[request] Sending a request...[response] Response for 3877031: "2012-11-27 22:04:28 -0600"
这里不足为奇:subscribe显然不适用于同步调用.令人惊讶的是,我无法在AMQP gem源代码或任何在线文档中找到同步替代方案.是否有订阅的替代方法可以提供我想要的RPC行为?鉴于系统的其他部分我想要使用合法的异步调用,bunny gem似乎不适合这项工作.我应该再看一眼吗?
编辑以响应Sam Stokes
感谢Sam提供的抛出指针:async / async.callback.我之前没有见过这种技术,这正是我首先尝试用这个实验学习的东西. send_response.finish在Rails 3中消失了,但是我能够通过一个小的改动让他的例子至少为一个请求工作:
render :text => @messagerendered_response = response.prepare!
后续请求失败!!处理请求时出现意外错误:死锁;递归锁定.这可能是Sam在获取有关获取ActionController以允许并发请求的注释时所得到的,但引用的gist仅适用于Rails 2.在development.rb中添加config.allow_concurrency = true可以在Rails 3中消除此错误,但是导致此队列已具有默认使用者.来自AMQP.
我觉得这只牦牛已经剃光了. 总结
以上是内存溢出为你收集整理的ruby-on-rails – 我可以在Rails 3中使用AMQP使用请求/回复 – RPC模式吗?全部内容,希望文章能够帮你解决ruby-on-rails – 我可以在Rails 3中使用AMQP使用请求/回复 – RPC模式吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)