9

Rails アプリで AMQP サブスクライバーを開始することはできますか? おそらくイニシャライザなどを介して。

Railsモデルとやり取りできると同時に実行したいと思います。以下は、私が意味することの疑似コードの例です。

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

1 に答える 1

12

私は通常、レール環境をロードする別のメッセージングデーモンを介してこれを行います。

したがって、非常に単純な例は 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 に必要な適切な gem が必要です: amqp、daemons、eventmachines

次に、アプリと一緒に手動で実行します。

RAILS_ENV=development script/myapp_daemon.rb run

または、アプリの初期化子の 1 つから開始します。

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_

最後に、Bunny がクライアントに必要なすべてを達成するかどうかを確認します。これは簡単です: https://github.com/celldee/bunny/wiki/Using-Bunny

それが役立つことを願っています

于 2011-08-13T20:43:56.200 に答える