繁体   English   中英

如何在Rails中获取delay_job的输出

[英]How can I get the output of delayed_job in rails

我有一个“状态”页面。 我正在显示本地计算机的状态(例如当前的上载/下载速度)的录像是否在进行。

为了获得上述信息,我将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

这是我的long_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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM