为什么延迟作业错误回调不会执行?

时间:2017-05-11 00:24:51

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

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

这是我的工作:

# 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

以下是我安装的潜在相关宝石。我使用的是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语句。

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

1 个答案:

答案 0 :(得分:1)

错误回调可能正常工作。大多数操作系统的标准输出都是缓冲的。因此,我非常确定字符串是否被缓冲,直到服务器关闭,这会刷新缓冲区。

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