从 Rails 监听 Juggernaut 事件
Posted
技术标签:
【中文标题】从 Rails 监听 Juggernaut 事件【英文标题】:Listening to Juggernaut events from Rails 【发布时间】:2011-10-20 19:44:05 【问题描述】:我正在使用 Juggernaut、Redis、SQLite 和 Rails 3.1 构建一个简单的实时聊天
我想在另一个用户断开连接时(例如他关闭窗口)给每个用户写一条新消息,这是为了监听 Juggernaut 的客户端断开连接事件。
Juggernaut docs 说我可以在服务器端(Ruby)做到这一点
Juggernaut.subscribe do |event, data|
# Use event/data
end
问题是我不知道应该将此代码放在我的 Rails 应用程序中的什么位置(控制器、模型、观察者?)。我已经尝试将它放入模型中,但是服务器不会响应任何将代码块放入模型中的请求。
我认为我应该从服务器端收听该事件,因为如果用户因为关闭窗口而断开连接,那么我没有该用户的“客户端”。
可能我错过了有关剑圣如何工作的一些信息。任何帮助将不胜感激。
【问题讨论】:
这里是代码使用示例:github.com/maccman/holla/blob/original/app/models/roster.rb 是的,我以前见过,但这似乎不是一个正常的导轨模型。该模型继承自 SuperModel::Base 而不是 ActiveRecord::Base。 github.com/maccman/supermodel,这不是一个普通的rails项目,他用SuperModel替换了ActiveRecord 是的,我知道那个项目,它来自剑圣的作者。但我需要从普通的 Rails 应用程序(不使用该 SuperModel)中监听事件 Mouarf 可能正在使用观察者或类似的东西......我不知道剑圣很酷:) 【参考方案1】:好的,我终于回答自己了:
我发现问题是当进程运行调用 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)。
希望对某人有所帮助!
【讨论】:
以上是关于从 Rails 监听 Juggernaut 事件的主要内容,如果未能解决你的问题,请参考以下文章
使用 juggernaut 作为 rails 插件时遇到问题
Rails 3.1 在 Ubuntu 11.10 上使用 Socket.io/Juggernaut
使用 rails 应用程序启动 Juggernaut 和 Redis