我有一个Rails 5应用程序,我刚刚安装了Sidekiq gem作为Rails ActiveJob的后端。
我的问题是,即使我成功地加入了一个作业并完成了它,所有的Sidekiq统计都停留在零。
我做了什么?
$ brew update
$ brew install redis
$ brew services start redis
# Gemfile
gem 'sidekiq'
gem 'sidekiq-failures', '~> 1.0'
$ bundle install
$ bundle binstub sidekiq
# config/application.rb
class Application < Rails::Application
config.active_job.queue_adapter = :sidekiq
end
# config/routes.rb
Rails.application.routes.draw do
require "sidekiq/web"
mount Sidekiq::Web => '/sidekiq'
end
# config/sidekiq.yml
:concurrency: 3
:timeout: 60
:verbose: true
:queues: # Queue priority: https://github.com/mperham/sidekiq/wiki/Advanced-Options
- default
- mailers
$ rails s
$ sidekiq
$ rails c
8. 尝试使用 perform_later
在下面的测试工作中。
class TestCreateSnippetJob < ApplicationJob
queue_as :default
def perform(shop_domain = "shoes-lab.myshopify.com")
puts "hello job"
sleep 30
end
end
$ TestCreateSnippetJob.perform_later
这是我得到的结果:
[1] pry(main)> TestCreateSnippetJob.perform_later
Enqueued TestCreateSnippetJob (Job ID: bc5bf654-09f5-4c77-95d8-8258a560525d) to Async(urgent)
=> #<TestCreateSnippetJob:0x00007feec140e9c8
@arguments=[],
@executions=0,
@job_id="bc5bf654-09f5-4c77-95d8-8258a560525d",
@priority=nil,
@provider_job_id="a59c111d-ebe1-43b2-bf23-55748b660af8",
@queue_name="urgent">
[2] pry(main)> Performing TestCreateSnippetJob (Job ID: bc5bf654-09f5-4c77-95d8-8258a560525d) from Async(urgent)
hello job
Performed TestCreateSnippetJob (Job ID: bc5bf654-09f5-4c77-95d8-8258a560525d) from Async(urgent) in 30038.27ms
我的问题是:即使TestCreateSnippetJob已经完成,监控rootsidekiq也没有显示任何 "已处理 "的作业。每个统计都停留在0。
此外,当我试图从任务中启动这个作业时,什么都没有发生,作业没有被执行,不像我试图直接从控制台启动它。
namespace :test do
desc "TODO"
task test: :environment do
TestCreateSnippetJob.perform_later
puts "Task done"
end
end
你们知道我哪里做错了吗?
似乎Rails(v5.2.3)覆盖了ActiveJob queue_adapter。正如 @Mike Perham 所说,我的日志显示我使用的是 :async 适配器,而不是 :sidekiq,即使我添加了 config.active_job.queue_adapter = :sidekiq
行至 config/application.rb.
所以我试着添加 config.active_job.queue_adapter = :sidekiq
到 config/environments/development.rb
and sidekiq work fine this time, the jobs are enqueued to Sidekiq. However, is the good practice do this way?
然而,这样做是一个好的做法吗?
PS:只有当我保持 config.active_job.queue_adapter = :sidekiq
一行 config/application.rb.
和 config/environments/development.rb
.
在这两种情况下,无论我是否添加了 config.active_job.queue_adapter = :sidekiq
一行 config/environments/development.rb
除了同一句话之外,在 config/application.rb.
,命令 $ Rails.application.config.active_job_queue_adapter
返回 :sidekiq
您的日志显示您使用的是:async适配器,而不是:sidekiq。
Enqueued TestCreateSnippetJob (Job ID: bc5bf654...) to Async(urgent)