Rails应用程序内的AMQP订阅者

Fot*_*ios 9 ruby-on-rails amqp rabbitmq

是否可以使用我的Rails应用程序启动AMQP订阅者?可能通过初始化器或其他东西.

我想让它同时运行,也可以与Rails模型交互.下面是我的意思的伪代码示例.

queue.subscribe do |msg,body|
  Foo.create(....)
end
Run Code Online (Sandbox Code Playgroud)

joh*_*ano 12

我通常通过一个单独的消息传递守护进程来加载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

Run Code Online (Sandbox Code Playgroud)

您还需要在Gemfile中使用正确的gem:amqp,daemons,eventmachine

然后在您的应用旁边手动运行:

RAILS_ENV=development script/myapp_daemon.rb run
Run Code Online (Sandbox Code Playgroud)

或者从您的某个应用初始值设定项启动它:

system('script/myapp_daemon.rb start')
Run Code Online (Sandbox Code Playgroud)

要深入了解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_

最后看看Bunny是否能完成客户端所需的一切,更简单:https: //github.com/celldee/bunny/wiki/Using-Bunny

希望有所帮助