如何在rails中获取delayed_job的输出

时间:2014-09-24 08:56:46

标签: ruby-on-rails ruby ruby-on-rails-3 delayed-job

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

为获取上述信息,我正在使用该机器。这是我的示例代码

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 个答案:

答案 0 :(得分:0)

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

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