所以,我有一个代码,是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。
答案 0 :(得分:0)
很难说是怎么回事。找到答案的方法是在执行方法中放置debugger
并在前台运行sidekiq worker。这让你有机会逐步完成这些方法。
您最终会进入Sidekiq::Clients push method。这就是它变得有趣的地方。
bundle exec sidekiq
对于1.9,您可以使用debugger gem。
答案 1 :(得分:0)
您可以从rake任务访问sidekiq的路线吗?在控制器中尝试它,看看它是否与rake任务有关。也许你错过了包含或要求。如果你摆脱救援区,它会崩溃并发出错误吗?
我认为您正在捕捉Redis的连接错误,但它确实尝试连接到Sidekiq,而Sidekiq又使用redis。
我只是在这里吐出想法...
答案 2 :(得分:0)
对perform_async的调用挂起。 perform_async将作业写入Redis,但尚未执行。我猜这个工作永远不会到达Redis所以sidekiq工作者永远不会得到改变。因此,您看不到perform方法的记录。你能看到Redis的工作吗?
如果您正在使用rails,可以将其添加到routes.rb文件中,以便能够检查sidekiq队列。
require 'sidekiq/web'
mount Sidekiq::Web, at: '/sidekiq'
如果您可以在sidekiq队列中看到该作业,则必须启动一名工作人员来处理该表演。如果没有工作,您必须检查Redis连接。
答案 3 :(得分: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
答案 4 :(得分:0)
问题出在Redis配置中。它使用了Sentinel,关闭Sentinel以进行开发解决了它。