ruby-on-rails – 什么可能导致计划的Rails活动作业消失?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 什么可能导致计划的Rails活动作业消失?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我怀疑我们的一些活跃工作正在消失,但我不知道为什么.下面是我发现它消失的证据,但不是原因.

我们的网站使用外部云打印服务.我们解雇工作,然后检查他们的状态.成功创建远程云打印后,我们创建一个活动作业来立即检查状态.如果它已完成(成功或其他),则标记为如此.如果没有,那么检查状态作业会创建另一个,稍有延迟.每次延迟都会增加.

今天一个状态检查,日志显示等待达到128秒.但是没有发生下一次状态检查,并且日志中也没有错误.

我们使用延迟工作支持的积极工作.状态检查作业的代码如下.它无法看到逻辑中的任何缺陷,这些缺陷不会导致正确收集状态检查或另一次尝试等待.

class CheckCloudPrintStatusJob < ApplicationJob
  queue_as :default

  def perform(cloud_print,count = 0)
    cloud_print.update_status

    unless cloud_print.finished?
      count += 1
      wait = 2**(count-1)

      if count > 15
        cloud_print.mark_as_Failed

        puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
        puts "~~~~~~~~~~~~~~~~~~ Cloud printing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
        puts "Cloud print ##{cloud_print.id} Failed"
        puts "Finally waited #{wait} seconds and then cancelled."
        puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
      else
        puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
        puts "~~~~~~~~~~~~~~~~~~ Cloud printing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
        puts "Checking status of cloud print ##{cloud_print.id}"
        puts "Waiting #{wait} seconds and then retrying."
        puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"

        CheckCloudPrintStatusJob.set(wait: wait.seconds).perform_later(cloud_print,count)
      end
    end
  end
end

解决方法

正确,所述逻辑中没有任何缺陷会导致正确收集状态检查或另一次等待尝试.

我已经通过以下设置验证了您的作业代码在128秒等待之后成功运行:

> rails新项目
> delayed_job_active_record添加到Gemfile(运行bundle install)
> rails生成delayed_job:active_record和rake db:migrate以安装gems并创建Delayed Job DB表
> config.active_job.queue_adapter =:config / application.rb中的delayed_job
>基本的CloudPrint<带有update_status的ApplicationRecord模型,完成了吗?和app / models / cloud_print.rb中的mark_as_Failed方法
> app / jobs / check_cloud_print_status_job.rb中提供的代码
>通过Rails控制台运行CheckCloudPrintStatusJob.perform_later(CloudPrint.create)来排队作业(bin / rails c)

由于上述序列表现正确且没有任何问题,因此您需要通过提供更多实际再现问题的complete and verifiable example来扩展搜索.一旦您能够一致地重现问题,或者调查环境和项目配置的其他方面,就可以将整个Rails项目上传到GitHub仓库中.以下是一些可能性:

>模型类中可能存在可能引发异常的逻辑;
>工作者处理守护程序可能已被中止或杀死;
>作业队列可能已被清除(例如,通过rake作业:清除)
>另一个进程可以修改和/或删除正在处理的模型对象;
>完成了吗?调用update_status后可能返回true,导致即使处理成功完成,也不会打印最终状态检查.

注: – 延迟作业支持以5秒N ** 4的延迟重试失败的作业,其中N是尝试次数,不需要自己重新实现此逻辑.如果cloud_print.finished,只是引发异常?是假的,你不应该需要任何其他自定义延迟代码

class CheckCloudPrintStatusJob < ApplicationJob
  queue_as :default

  def perform(cloud_print)
    raise 'Not ready' unless cloud_print.finished?
  end
end

猜你在找的Ruby相关文章