我有一个使用兔子的rabbitmq消费者的代码,它应该监听发布到rabbitmq队列的消息,并在消息被消费时在视图上显示一个flash通知。消费者在与生产者不同的会话中运行,尽管它们在同一个应用程序中。该应用程序使用直接交换,它使用消息接收者的电子邮件作为 routing_key。我希望在routing_key
发布与 current_user 的电子邮件类似的消息时,会为该用户显示一条闪烁消息,指示他有一条新消息而无需刷新页面。我想要类似于 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
问题是我不知道将消费者代码放在哪里。我曾尝试将代码作为方法放在应用程序控制器中,但这似乎不起作用。任何关于如何更好地做到这一点的建议都非常感谢。