Sidekiq 逻辑出错或报异常的时候, 我们会希望它能自动通知我们, 或者自动关闭一些线程什么的, 这些都可以在error_handlers里达成.

error_handlers

打开initialize/sidekiq.rb, 找到 Sidekiq.configure_server do |config|.., 里头添加一下代码:

Sidekiq.configure_server do |config|
    ...

    config.error_handlers << ->(ex, ctx_hash) do
      puts ex
      puts ctx_hash
    end
  end

以上代码在 Sidekiqconfig 里添加了一个新的 error_hendler, error_hendler的参数有两个, exctx_hash

通过打印出来的代码可以知道, ex 是报错内容, ctx_hash 里是当前线程的信息, 和sidekiq log 里报错时打印出来的信息是一致的:

# 我的报错信息
{"context"=>"Job raised exception", "job"=>{"class"=>"ErrorWorker", "args"=>[2004], "queue"=>"error", "enable"=>true, "retry"=>true, "jid"=>"41dd3793a2446b4941214988", "created_at"=>1576211786.9483526, "enqueued_at"=>1576211786.9486291}, "jobstr"=>"{\"class\":\"ErrorWorker\",\"args\":[2004],\"queue\":\"error\",\"enable\":true,\"retry\":true,\"jid\":\"41dd3793a2446b4941214988\",\"created_at\":1576211786.9483526,\"enqueued_at\":1576211786.9486291}"}

控制特定线程

有了ctx_hash 我们就可以针对特定的 Worker 特定的 perform 线程进行报错反馈.

比如我们要对 MailWorker 里参数为 1000 的线程进行报错反馈, 在线程报错时将报错内容记录到数据库中方便以后查看.

config.error_handlers << ->(ex, ctx_hash) do
    if ctx_hash[:job]["class"] == "MailWorker" and ctx_hash[:job]["args"] == [1000]
        # 保存 ex到数据库
    end
end

最后

因为以上更改了 initialize 所以需要重启服务才能生效.