2010-05-14 13 views
8

È possibile avviare un abbonato AMQP con la mia app Rails? Forse attraverso un inizializzatore o qualcosa del genere.Abbonato AMQP all'interno dell'app Rails

Mi piacerebbe averlo in esecuzione allo stesso tempo che può anche interagire con i modelli Rails. Di seguito è riportato un esempio di pseudo-codice di ciò che intendo.

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

Mi chiedo dove hai deciso di iscriverti, inizializzatore o altrove? – Waheedi

risposta

11

Solitamente lo faccio tramite un demone di messaggistica separato che carica l'ambiente delle rotaie.

Quindi un esempio molto semplicistico sarebbe simile a questa in 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 

si dovrà inoltre la gemma diritto richiede nel vostro Gemfile: AMQP, demoni, eventmachine

allora o eseguirlo manualmente a fianco la vostra applicazione:

RAILS_ENV=development script/myapp_daemon.rb run 

o avviarlo da uno dei vostri initializers app:

system('script/myapp_daemon.rb start') 

Per scavare in AMQP controllare quanto segue, questo darà una bella panoramica di alto livello: http://www.rubyinside.com/why-rubyists-should-care-about-messaging-a-high-level-intro-5017.html

Questo dà una spiegazione molto dettagliata con esempi di lavoro: http://rubydoc.info/github/ruby-amqp/amqp/master/file/docs/Exchanges.textile#Publishing_messages_as_immediate_

finalmente vedere se Bunny compie tutto il necessario per il cliente, è più semplice: https://github.com/celldee/bunny/wiki/Using-Bunny

Speranza che aiuta

+0

Osservando la tua implementazione, lancia in modo ricorsivo i daemon? – futbolpal

+0

Basta notare che l'avvio da un inizializzatore verrà avviato nella console di rails e in genere tutto ciò che avvia l'app. – Spyros

Problemi correlati