2

所以,我有一个代码,是 rake 任务的一部分:

  class DrivingStatJob < DBJob
  sidekiq_options :queue => :driving_stats, :backtrace => true

  def perform(work_order_id)
    Rails.logger.info "Calculating driving stats for work_order #{work_order_id}"
    begin
      work_order = WorkOrder.find(work_order_id)
      return unless work_order.steps.size > 1
      DrivingStat.calculate!(work_order.steps.first.location.address, work_order.steps.last.location.address)
    rescue DrivingStatService::MissingCoordinatesError
      Rails.logger.warn "Unable to fetch coorindates for work order #{work_order_id}"
    rescue ActiveRecord::RecordInvalid => e
      Rails.logger.warn "Unable to save driving stat: #{e.message}"
    rescue ActiveRecord::RecordNotFound
      # Ignore
    rescue RuntimeError => e
      Rails.logger.warn "Unable to compute driving directions"
      Rails.logger.warn [e.message, e.backtrace].join("\n")
    end
  end
end

调用“执行”的代码:

begin
  DrivingStatJob.perform_async(id) if changed
rescue Redis::CannotConnectError => e
  logger.warn "Unable to queue up driving stats job"
  logger.warn [e.message, e.backtrace].join("\n")
end

问题:它挂在DrivingStatJob.perform_async(id). 它只是挂起,没有错误。“执行”功能没有日志消息。它可能是什么?Redis 正常运行,sidekiq 正常运行。Redis 在 127.0.0.1:6379 上运行,Sidekiq 显示它知道 Redis 在那里。

Linux Mint 15、Ruby 1.9.3、Redis 2.6、sidekiq-2.14。

4

5 回答 5

0

问题出在 Redis 配置中。它使用 Sentinel,关闭 Sentinel 以便开发解决了它。

于 2013-09-29T05:34:12.340 回答
0

很难说发生了什么。一种找出方法是debugger在您的 perform 方法中放置 a 并在前台运行 sidekiq 工作人员。这使您有机会逐步了解这些方法。

您最终将使用Sidekiq::Clients 推送方法。这就是有趣的地方。

bundle exec sidekiq

对于 1.9,您可以使用调试器 gem

于 2013-09-22T06:56:04.443 回答
0

对 perform_async 的调用挂起。perform_async 将作业写入 Redis,但尚未执行。我猜这项工作永远不会到达 Redis,所以 sidekiq 工作人员永远不会得到执行的更改。因此,您看不到 perform 方法的日志记录。你能看到 Redis 中的工作吗?

如果您使用的是 rails,您可以将其添加到您的 routes.rb 文件中,以便能够检查 sidekiq 队列。

require 'sidekiq/web'
mount Sidekiq::Web, at: '/sidekiq'

如果您可以在 sidekiq 队列中看到作业,则必须启动一个工作人员来处理执行。如果没有作业,您必须检查 Redis 连接。

于 2013-09-24T06:15:28.420 回答
0

您可以从您的 rake 任务中访问 sidekiq 的路线吗?在控制器中尝试它,看看它是否与 rake 任务有关。也许您缺少包含或要求。如果你摆脱了救援块,它会崩溃并给出错误吗?

我认为您正在捕获 Redis 的连接错误,但它实际上是在尝试连接到 Sidekiq,而 Sidekiq 又使用了 redis。

我只是在这里吐出一些想法......

于 2013-09-23T06:58:16.497 回答
0

如果您在除默认队列之外的任何队列下调度作业,则需要在启动 sidekiq 时显式传入队列名称。

bundle exec sidekiq -q driving_stats

此外,您可能需要确保在正确的环境中运行它

bundle exec sidekiq -q driving_stats -e production

或者

bundle exec sidekiq -q driving_stats RAILS_ENV=production

如果由于某种原因这不起作用,请一起取出 sidekiq_options 并使用简单的命令在默认队列上运行它

bundle exec sidekiq

另外:您是否将 sidekiq 工人包括在您的父母或孩子班级中,对吗?

class DBJob
  include Sidekiq::Worker
end
于 2013-09-28T23:56:22.350 回答