2012-02-23 96 views
4

好吧,我决定改进我所要求的帮助,只是在这个问题上开一个新的问题。如果我知道当客户端在我的Rails应用程序上提交表单时,运行cron作业,用户从下拉菜单中选择cron作业的时间,我相信我可以完成以下任务。有没有办法做到这一点,我一直在寻找想法,但没有找到一个。客户提交的表格在Rails上创建一个Cron作业

老问题

我试图开发一个系统,允许用户将电影上传到我的网站,然后把它以一定的时间播放。电影将不断流媒体,以便在一个小时后的某个时间,队列中的下一部电影将播放。我想知道是否有一个宝石或脚本已经这样做?或者做什么最好的方法是什么,我认为是用cron或延迟工作这样的工作来做,但我认为这不是最有效的方法。任何意见,将不胜感激。

p.s.我认为一个简单的解释是,在YouTube上你可以排队播放视频,所以我们可以在轨道上做类似的事情,这有助于解决我的问题。

回答

2

如果用户决定播放的确切时间,您可以使用rufus-scheduler宝石。在你的时间

插头从用户像这样获得的:

scheduler = Rufus::Scheduler.start_new 
scheduler.at @user_defined_time do 
    some_method 
end 

some_method可以协同工作,与socket.io包装像Juggernaut,这将消息发送到用户的浏览器,它会执行一些JS那会获取视频并播放它。

你可以用这个做的事情基本上是打开你的浏览器窗口,当达到预定时间时,浏览器会获取合适的视频并播放它。

如果你需要实现一个视频排队系统,你可以让用户按照ID排队他们想要的视频,然后通过回调函数的方式调用队列中的下一个视频。视频已结束。回调将查询数据库中队列中的下一个视频,获取视频并播放它。

+0

谢谢,这听起来像它可能是我寻找的最好的综合模型,如果它不工作我肯定会尝试其他解决方案在这里。 – eWizardII 2012-03-04 06:23:09

1

我不相信你甚至需要做前台调度的背景资料。 甚至不需要为剑圣或任何克伦工作thingy。

这一切都可以简单地通过使用JavaScript来实现。 您可以使用javascript的setTimeout()和clearTimeout()函数,或者在ajax调用之前添加sleep()。

这里的步骤:

  1. 您加载的第一部电影或只是网页。
  2. 在setTimeout函数内调用ajax。 注意:不要忘记将setTimeout()分配给一个变量,以便您可以执行clearTimeout(the_variable)。 这是详细的用法:http://www.w3schools.com/js/js_timing.asp
  3. setTimeout作为setTimeout(javascript_statement,毫秒)...这些毫秒应该是当前电影的总时间或用户设置的任何时间从当前时间减去你剩下的毫秒数将被播放。
  4. 在此ajax请求中发送当前电影ID,以便在服务器上可以计算在电影刚刚播放后要播放哪部电影......通过提取使用此发送的电影ID参数播放的最后一部电影。
  5. 我也相信你会需要一些功能,比如只播放当前电影结束后的下一部电影。所以基本上你也可以用setTimeout()函数来替代使用电影播放器​​功能的Ajax调用。当电影播放器​​完成播放当前电影时,只需向服务器发送ajax调用...再次发送请求中的当前电影标识。
  6. 如果即使在完成当前电影之后,您想等待适当的时间来启动电影,您需要使用periodic_call_remote,它会在设定的秒数后发送ajax请求。
  7. 一旦在服务器上,即在您的控制器中,您处理该ajax请求,一旦您确定您需要现在显示电影,只需用包含播放器的部分和带有自动播放功能的newmovie链接替换播放器容器-on-load设置为true。
1

我对那些严重依赖计划任务的项目使用了非常流行的Whenever,这很好。它给你一个很好的DSL来定义你的计划任务,而不必处理crontab格式。从自述:

Whenever is a Ruby gem that provides a clear syntax for writing and deploying cron jobs. 

实施例从自述:

every 3.hours do 
    runner "MyModel.some_process"  
    rake "my:rake:task"     
    command "/usr/bin/my_great_command" 
end 

every 1.day, :at => '4:30 am' do 
    runner "MyModel.task_to_run_at_four_thirty_in_the_morning" 
end 

在上面的查询将您的用户定义的参数。而已。