Абонент AMQP внутри приложения Rails - PullRequest
9 голосов
/ 14 мая 2010

Можно ли запустить абонента AMQP с моим приложением Rails? Возможно, через инициализатор или что-то.

Я бы хотел, чтобы он работал одновременно и мог взаимодействовать с моделями Rails. Ниже приведен пример псевдокода того, что я имею в виду.

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

1 Ответ

12 голосов
/ 14 августа 2011

Обычно я делаю это через отдельный демон обмена сообщениями, который загружает среду rails.

Так что очень упрощенный пример будет выглядеть в 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

В вашем Gemfile вам также потребуются нужные драгоценные камни: amqp, daemons, eventmachine

Затем либо запустите его вручную вместе с приложением:

RAILS_ENV=development script/myapp_daemon.rb run

Или запустите его из одного из инициализаторов вашего приложения:

system('script/myapp_daemon.rb start')

Чтобы заглянуть в amqp, проверьте следующее, это даст хороший обзор высокого уровня: http://www.rubyinside.com/why-rubyists-should-care-about-messaging-a-high-level-intro-5017.html

Это дает очень подробное объяснение с рабочими примерами: http://rubydoc.info/github/ruby-amqp/amqp/master/file/docs/Exchanges.textile#Publishing_messages_as_immediate_

Наконец, посмотрите, выполняет ли Банни все, что вам нужно для клиента, это проще: https://github.com/celldee/bunny/wiki/Using-Bunny

Надеюсь, это поможет

...