Rails 使用 4.2 的 active_job 和 Sidekiq,但是不工作

lukefan · 2015年08月19日 · 最后由 huacnlee 回复于 2015年08月20日 · 2813 次阅读

配置了 sidekiq 和 redis,尝试了一下后台任务,工作正常。 想尝试一下 rails 4.2.3 的,active_job,inline 模式的时候,后台工作是在主进程中工作的。 设置了 config.active_job.queue_adapter = :sidekiq

但是,不工作。我是不是少设置了什么东西? sidekiq 是否在后台工作,好像任务都提交了,但是什么也没有发生。

我提供一个思路,首先检查 sidekiq 的后台进程状态和参数,

Sidekiq 官方推荐通过 yml 文件来配置 sidekiq 启动参数,需要注意的是配置文件中的 queues 部分必须跟 ActiveJob 中的 queue_as 保持一致。然后通过 ps aux | grep sidekiq 检查进程在后台的运行状态。

Sidekiq 的后台进程实际工作方式是去 polling 配置文件中指定的队列,当任务 enqueue 之后,sidekiq 后台进程拿到消息,通过消息中的 class_name 和参数反射得到 ActiveJob 的实例然后执行,所以如果没有通过配置文件提前指定要 polling 的队列的话,就有可能永远拿不到消息,跟楼主描述的情况很类似。

启动了 worker 没?

sidekiq 是要启动的。

开发环境启动

redis-server ./config/redis.conf
sidekiq -C config/sidekiq.yml -P ./tmp/pids/sidekiq.pid

不要因为访问 http://localhost:3000/sidekiq 能打开,就认为 sidekiq 已经启动了,NO!这只是 sinatra 启动了监控界面,你会看到一堆 Enqueued 的。

#1 楼 @lgn21st queue 的名字设定对了,就工作了。 非常感谢。

sidekiq 启动需要告知那些 queue 分类需要执行,注意 -q 参数

$ sidekiq -h
2015-08-20T02:03:58.993Z 22623 TID-ov0q33mxs INFO: sidekiq [options]
    -c, --concurrency INT            processor threads to use
    -d, --daemon                     Daemonize process
    -e, --environment ENV            Application environment
    -g, --tag TAG                    Process tag for procline
    -i, --index INT                  unique process index on this machine
    -q, --queue QUEUE[,WEIGHT]       Queues to process with optional weights
    -r, --require [PATH|DIR]         Location of Rails application with workers or file to require
    -t, --timeout NUM                Shutdown timeout
    -v, --verbose                    Print more verbose output
    -C, --config PATH                path to YAML config file
    -L, --logfile PATH               path to writable logfile
    -P, --pidfile PATH               path to pidfile
    -V, --version                    Print version and exit
    -h, --help                       Show help

需要 登录 后方可回复, 如果你还没有账号请 注册新账号