2014-09-24 30 views
0

我有一个“状态”页面。我正在显示本地机器的状态,例如当前的上传/下载速度,是否正在录制。如何在rails中获取delayed_job的输出

为了获得上述信息我ssh进入该机器。这里是我的示例代码

Net::SSH.start('localhost','ubuntu', :password => 'ubuntu') do |session| 
    upload_speed = session.exec!("speedtest | grep Upload:").chomp.strip 
    return upload_speed 
end 

但是这需要花费时间(大约3-4分钟)来获取这些状态。它返回我“连接超时错误”。所以我试图在后台添加这个过程。对于这个我使用delayed_job gem

这里是我的代码,它 我控制器的方法

def unit_additional_status 
    @machine = MachineInfo.find(params[:unit_id])  
    stat = Delayed::Job.enqueue(LongerTask.new(@machine), 3, :run_at => 1.seconds.from_now) 
end 

这里是我的longer_task.rb文件

require 'rubygems' 
    require 'net/ssh' 

    class LongerTask < Struct.new(:machine) 
     def perform 
      port = @machine.port 
      @status = Hash.new 
      Net::SSH.start('localhost','ubuntu', :password => 'ubuntu', :port => port) do |session| 
       upload_speed = session.exec!("speedtest | grep Upload:").chomp.strip 
       status["upload_speed"].push(upload_speed) 
      end 
      @status 
     end 
end 

执行后,我要通过这@status到我的控制器操作,以便我可以将它传递到我的status.html.erb视图。

所以我有一个问题,我怎么能把它传递给我的控制器方法或如何得到执行延迟作业的输出。

此外,如果任何人有更好的解决方案,然后让我知道。

我使用rails 3.2.14ruby 1.8.7

+1

延迟工作的重点在于他们在后台运行,而且他们不知道何时运行。他们可以安排在今天和明天运行。从他们那里获取任何数据是没有意义的,因为用户需要等待随机的时间来获取这些数据。 – BroiSatse 2014-09-24 09:02:33

+0

@BroiSatse,所以这个'delayed_job'不是一个好的解决方案。 – user2622247 2014-09-24 09:30:34

+0

有没有其他方法可以做到这一点? – user2622247 2014-09-24 09:37:15

回答

0

您需要创建某种附加状态的模式,例如Job (status:string, message:string)。然后在计划时将此模型的实例传递给延迟的作业任务。当任务开始执行时,您将状态设置为“正在运行”。完成后,使用所需的结果信息更新消息字段并将状态设置为“已完成”。这有几个好处,例如您可以很好地查看作业队列,并且可以扩展以反映执行时间,错误等。

要在您的示例中显示机器状态,只需选择状态为''的最新作业完成'并显示其时间戳和消息。

相关问题