为什么 Delayed Job 错误回调不执行?

Why won't the Delayed Job error callback execute?

我正在尝试按照 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。在大多数操作系统上,标准错误不会被缓冲。