我正在使用Juggernaut 2为实时推送通知编写一个rails应用程序,但不确定如何解决这个问题。我有许多用户在聊天室中,并希望运行一个定时器,以便每30秒将推送发送到聊天室中的每个浏览器。Juggernaut 2是基于node.js构建的,因此我认为需要在那里编写此代码。但是我不知道从哪里开始将其与Juggernaut 2集成。
我正在使用Juggernaut 2为实时推送通知编写一个rails应用程序,但不确定如何解决这个问题。我有许多用户在聊天室中,并希望运行一个定时器,以便每30秒将推送发送到聊天室中的每个浏览器。Juggernaut 2是基于node.js构建的,因此我认为需要在那里编写此代码。但是我不知道从哪里开始将其与Juggernaut 2集成。
我只是大致浏览了 Juggernaut,所以请对我的回答持保留态度...
每次循环迭代要做什么?好吧,上述Channel代码的链接有一个publish方法:
publish: function(message){
var channels = message.getChannels();
delete message.channels;
for(var i=0, len = channels.length; i < len; i++) {
message.channel = channels[i];
var clients = this.find(channels[i]).clients;
for(var x=0, len2 = clients.length; x < len2; x++) {
clients[x].write(message);
}
}
}
所以你基本上需要创建一个消息对象,将message.channels设置为Channel.channels,如果你将该消息传递给publish方法,它将发送到所有客户端。
至于你的消息内容,我不知道你在客户端使用什么(socket.io?已经为你构建了Juggernaut和socket.io的聊天客户端?),所以这取决于你。
至于放置创建间隔并触发回调以将消息发布到所有频道的代码的位置,你可能需要在创建实际侦听给定端口的服务器的代码中检查此处:(https://github.com/maccman/juggernaut/blob/master/lib/juggernaut/server.js)如果你在init()中附加间隔,那么一旦启动服务器,它将每30秒检查一次以将给定的消息发布到每个频道。
这是一个使用 Ruby 每 30 秒推送的示例客户端。
使用 Redis 和 Node 安装您的 Juggernaut:安装 Ruby 和 RubyGems,然后运行 gem install juggernaut
。
#!/usr/bin/env ruby
require "rubygems"
require "juggernaut"
while 1==1
Juggernaut.publish("channel1","some Message")
sleep 30
end
def start_quiz
Rails.logger.info("*** Quiz starting at #{Time.now}")
$redis.flushall # Clear all scores from database
quiz = Quiz.find(params[:quizz] || 1 )
@quiz_master = quiz.user
quiz_questions = quiz.quiz_questions.order("question_no ASC")
spawn_block do
quiz_questions.each { |q|
Rails.logger.info("*** Publishing question #{q.question_no}.")
time_alloc = q.question_time
Juggernaut.publish( select_channel("/quiz_stream"), {:q_num => q.num, :q_txt => q.text :time=> time_alloc} )
sleep(time_alloc)
scoreboard = publish_scoreboard
Juggernaut.publish( select_channel("/scoreboard"), {:scoreboard => scoreboard} )
}
end
respond_to do |format|
format.all { render :nothing => true, :status => 200 }
end
end