0

我有一个使用兔子的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

问题是我不知道将消费者代码放在哪里。我曾尝试将代码作为方法放在应用程序控制器中,但这似乎不起作用。任何关于如何更好地做到这一点的建议都非常感谢。

4

0 回答 0