2

我正在使用 Juggernaut、Redis、SQLite 和 Rails 3.1 构建一个简单的实时聊天

我想在另一个用户断开连接时向每个用户写一条新消息(例如他关闭了窗口),这是为了收听 Juggernaut 的客户端断开连接事件。

Juggernaut 文档说我可以在服务器端执行此操作(Ruby)

Juggernaut.subscribe do |event, data|
  # Use event/data
end

问题是我不知道我应该把这段代码放在我的 Rails 应用程序中的什么位置(控制器、模型、观察者?)。我试图将它放入模型中,但是服务器不会响应任何将代码块放入模型中的请求。

我认为我应该从服务器端收听该事件,因为如果用户因为关闭窗口而断开连接,那么我没有该用户的“客户端”。

可能我错过了关于剑圣如何工作的一些东西。任何帮助将不胜感激。

4

1 回答 1

6

好的,最后我回答自己:

我发现问题是当进程运行调用 Juggernaut.subscribe 时,它​​会冻结,直到触发 Juggernaut 事件。因此,您不能从服务器进程调用 Juggernaut,您需要一个新进程来运行该代码。

我的代码现在看起来像这样: 模型:

class MyModel < ActiveRecord::Base

  class << self
    def subscribe
      Juggernaut.subscribe do |event, data|
        case event
          when :subscribe
            # do something
          when :unsubscribe
            # do something else
        end
      end
    end
  end

end

然后我有一个 ruby​​ 脚本 myapp/scripts/juggernaut_listener:

#!/usr/bin/env ruby
require File.expand_path('../../config/environment',  __FILE__)

puts "Starting juggernaut listener"
MyModel.subscribe

所以在吃完服务器午餐后,我需要像这样给 Juggernaut 监听器吃午餐:

./script/participations_listener

(注意你应该给脚本 +x )。

希望它对某人有帮助!

于 2011-08-08T06:59:31.647 回答