Ruby AMQPはEventMachineに依存しているため、利用する際にはEventMachineのイベントループ内にいる必要がある。RailsからRabbitMQに接続する場合は、RailsのプロセスからRabbitMQにTCPのコネクションを張り、その中でchannelを作成することになる。
RabbitMQとのコネクションは、$RAILS_ROOT/config/initializers/amqp.rbというファイルを作成してその中で作成すると、起動時に実行されてコネクションを繋いでおくことができる。
接続設定
接続の設定ファイルはconfig/amqp.ymlなどとして保存しておけばいいんじゃないでしょうか。
development: host: localhost vhost: development test: host: localhost vhost: test production: host: localhost vhost: production
Thin
RailsのサーバーにThinを利用している場合、ThinがEventMachineベースなので特に気にせずconfig/initializers/amqp.rbには以下のように記述すれば良い。
def connect
yml = YAML.load File.read(File.join(Rails.root, 'config/amqp.yml'))
config = {}
yml[Rails.env].each do |key, value|
config[key.to_sym] = value
end
AMQP.connection = AMQP.connect(config)
end
EventMachine.next_tick do
connect
end
controllerでパブリッシュ
例えばAmqpController/publishでパブリッシュする場合、以下のようになる。
class AmqpController < ApplicationController
def publish
connection = AMQP.connection
channel = AMQP::Channel.new(connection)
exchange = channel.direct 'ex.direct'
msg = 'Hello, world'
exchange.publish(msg, :routing_key => 'tasks')
render :text => msg
end
end
No comments:
Post a Comment