【问题标题】:Why won't the Delayed Job error callback execute?为什么延迟作业错误回调不会执行?
【发布时间】:2017-10-09 19:37:43
【问题描述】:

我正在尝试关注 this guide 处理延迟作业的 API 速率限制。

这是我的工作:

# app/jobs/mailer_job.rb
class MailerJob < Struct.new(:custom_id)

  def perform
    # Intentionally throw an error to test error callback
    raise StandardError
  end

  def error(job, exception)
    puts 'Error!'
  end

end

这是我安装的可能相关的 gem。我正在使用 Ruby 1.9.3。

gem 'rails', '3.0.20'
gem 'passenger', '5.0.21'
gem 'delayed_job_active_record', '4.1.1'
gem 'delayed_job', '4.1.2'
gem 'foreman', '0.83.0'

我在延迟作业日志中看到以下内容:

[Worker(host:ubuntu pid:9912)] Starting job worker
[Worker(host:ubuntu pid:9912)] Job MailerJob (id=1720) RUNNING
[Worker(host:ubuntu pid:9912)] Job MailerJob (id=1720) FAILED (0 prior attempts) with StandardError: StandardError
[Worker(host:ubuntu pid:9912)] 1 jobs processed at 12.9574 j/s, 1 failed

我从来没有看到错误回调发生。但是,如果我用 CTRL+C 杀死 Rails 服务器,那么它会立即打印错误回调 puts 语句。

为什么自定义延迟作业的错误回调在服务器运行时不执行?

【问题讨论】:

  • 不能肯定地说,但很可能错误回调工作正常。大多数操作系统的标准输出(你没有说哪个)被缓冲。所以我很确定字符串正在被缓冲,直到服务器关闭,这会刷新缓冲区。试试 STDERR.puts。在大多数操作系统上,标准错误不会被缓冲。
  • 有趣的想法!我在 Ubuntu 16.04 LTS 上运行。
  • 您能否将您对使用STDERR.puts 的评论移至答案中,以便我将其标记为正确?就是这样!它出现在我预期的地方。
  • 好的。很高兴就是这样。

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


【解决方案1】:

错误回调可能工作正常。大多数操作系统的标准输出是缓冲的。所以我很确定字符串在服务器关闭之前被缓冲,这会刷新缓冲区。

试试STDERR.puts。在大多数操作系统上,标准错误不会被缓冲。

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2015-02-18
  • 2020-11-17
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2020-07-02
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多