2010-05-14 13 views
8

¿Es posible iniciar un suscriptor AMQP con mi aplicación Rails? Posiblemente a través de un inicializador o algo así.Suscriptor AMQP dentro de la aplicación Rails

Me gustaría tenerlo funcionando al mismo tiempo que también pueda interactuar con los modelos de Rails. A continuación se muestra un ejemplo de pseudo-código de lo que quiero decir.

queue.subscribe do |msg,body| 
    Foo.create(....) 
end 
+0

Me pregunto dónde ha decidido suscribirse, iniciarse o en otro lugar. – Waheedi

Respuesta

11

Normalmente lo hago a través de un daemon de mensajería independiente que carga el entorno de los rieles.

Así, un ejemplo muy simple sería el siguiente en RAILS_ROOT/script/myapp_daemon.rb:



    #!/usr/bin/env ruby 
    require 'rubygems' 
    require 'amqp' 
    require 'daemons' 

    ENV["RAILS_ENV"] ||= "development" 
    require File.dirname(__FILE__) + "/../config/environment" 

    options = { :backtrace => true, :dir => '.', :log_output => true} 

    Daemons.run_proc('myapp_daemon', options) do 
     EventMachine.run do 
     connection = AMQP.connect(:host => "127.0.0.1") 

     channel = AMQP::Channel.new(connection) 
     queue = channel.queue("/myapp_daemon", :durable => true) 
     exchange = channel.direct("") 

     queue.subscribe do |payload| 
      obj = JSON.parse(payload) 
      #... handle messages here, utilize your rails models 
      Foo.create(...) 
     end 
     end 
    end 

También se necesitaría la joya justo requiere en su Gemfile: amqp, demonios, EventMachine

entonces, o ejecutar de forma manual al lado de su aplicación:

RAILS_ENV=development script/myapp_daemon.rb run 

O iniciarlo desde una de sus inicializadores de aplicaciones:

system('script/myapp_daemon.rb start') 

Para profundizar en amqp echa un vistazo a la siguiente, esto le dará una visión general de alto nivel agradable: http://www.rubyinside.com/why-rubyists-should-care-about-messaging-a-high-level-intro-5017.html

Esto da una explicación muy detallada con ejemplos de trabajo: http://rubydoc.info/github/ruby-amqp/amqp/master/file/docs/Exchanges.textile#Publishing_messages_as_immediate_

Finalmente ver si conejito logra todo lo necesario para el cliente, es más simple: https://github.com/celldee/bunny/wiki/Using-Bunny

Espero que ayude

+0

En cuanto a su implementación, ¿lanza demonios de forma recursiva? – futbolpal

+0

Solo tenga en cuenta que comenzar eso desde un inicializador lo iniciará en la consola de rieles y generalmente todo lo que inicie la aplicación. – Spyros