bunnyを使用するこのコードは、rabbitmq キューに発行されたメッセージをリッスンし、メッセージが消費されるたびにビューにフラッシュ通知を表示する必要があります。コンシューマーは、同じアプリケーション内にありますが、プロデューサーとは別のセッションで実行されています。アプリケーションは、メッセージ受信者の電子メールを routing_key として使用する直接交換を使用します。current_user の電子メールに似たメッセージrouting_key
が公開されたときに、ページを更新せずにそのユーザーに新しいメッセージがあることを示すフラッシュ メッセージが表示されるようにしたいと思います。Facebook の通知と同様の動作が必要です。
プロデューサー コードは次のようになります。
class MessagesController < ApplicationController
def create
@message = Message.new(message_params)
@message.creator_id = current_user.id
@message.receiver_id = params[:message][:receiver_id]
if @message.save
email = @message.receiver.email
$message_exchange.publish(@message.content, :routing_key => email)
redirect_to user_path(current_user)
end
end
コンシューマ コード: 次のようになります。
email = current_user.email
$message_queue.bind($message_exchange, :routing_key => email)
logger.info " [*] Waiting for messages. To exit press CTRL+C"
$message_queue.subscribe(:manual_ack => true) do |delivery_info, properties, body|
logger.info " [x] #{delivery_info.routing_key}:#{body}"
if delivery_info.routing_key == current_user.email
flash[:notice] = "you have new message: #{body}"
end
end
問題は、消費者コードをどこに置くべきかわからないことです。コードをメソッドとしてアプリケーション コントローラーに配置しようとしましたが、うまくいかないようです。これを改善する方法についての提案は大歓迎です。