在开发模式中,我们使用rake jobs:work
。同样,为了在生产模式下进行测试,我们使用RAILS_ENV=production rake jobs:work
。
由于整个我的应用程序都在Apache Nginx服务器上,有没有像任何运行后台的gem /代码以及如何在不运行此命令的情况下运行作业的选项?
答案 0 :(得分:1)
如果你没有Redis,延迟工作是很好的,如果你已经在使用Redis我会推荐Sidekiq而不是延迟工作。主要区别在于延迟作业是基于SQL的作业工作者而Sidekiq使用Redis。
有关使用Sidekiq的详细信息,请查看Sidekiq: Getting Started指南。
延迟还附带了一个在后台运行作业的脚本。
script/delayed_job
可用于管理后台进程
开始工作。
要执行此操作,请将gem "daemons"
添加到Gemfile
并确保您已运行rails
generate delayed_job
。
然后您可以执行以下操作:
RAILS_ENV=production script/delayed_job start
RAILS_ENV=production script/delayed_job stop
# Runs two workers in separate processes.
RAILS_ENV=production script/delayed_job -n 2 start
RAILS_ENV=production script/delayed_job stop
# Set the --queue or --queues option to work from a particular queue.
RAILS_ENV=production script/delayed_job --queue=tracking start
RAILS_ENV=production script/delayed_job --queues=mailers,tasks start
# Use the --pool option to specify a worker pool. You can use this option multiple times to start different numbers of workers for different queues.
# The following command will start 1 worker for the tracking queue,
# 2 workers for the mailers and tasks queues, and 2 workers for any jobs:
RAILS_ENV=production script/delayed_job --pool=tracking --pool=mailers,tasks:2 --pool=*:2 start
# Runs all available jobs and then exits
RAILS_ENV=production script/delayed_job start --exit-on-complete
# or to run in the foreground
RAILS_ENV=production script/delayed_job run --exit-on-complete
Rails 4: 将bin / delayed_job替换为bin / delayed_job
工作人员可以在任何计算机上运行,只要他们可以访问 数据库和它们的时钟是同步的。请记住,每个工人都会检查 数据库至少每5秒钟一次。
您也可以调用rake jobs:work
来开始裁员。您可以
使用CTRL-C
取消佣金任务。
如果您只想运行所有可用作业并退出,可以使用rake jobs:workoff
通过设置QUEUE
或QUEUES
环境变量来处理队列。
QUEUE=tracking rake jobs:work
QUEUES=mailers,tasks rake jobs:work
答案 1 :(得分:1)
Miad是正确的,Sidekiq可能就是你要找的东西,除非你真的在谈论使用delayed job gem,这是另一个队列适配器。 Sidekiq基本上是一个连接Rails' ActiveJob Redis {{3}}。您可以使用ActiveJob创建作业,并通过从Job类调用perform方法来启动它们。这会将它们排入Sidekiq队列,将它们传递给redis,它们将异步执行。您的代码可能如下所示:
在(fn*
([G__19829]
[(. G__19829 getName)
((partial str "string val: ") G__19829)
(. G__19829 getAbsolutePath)
(vector G__19829)]))
user> ((juxt+ .getName
(partial str "string val: ")
.getAbsolutePath
vector)
(java.io.File. "aaa"))
["aaa"
"string val: aaa"
"/Users/.../aaa"
[#object[java.io.File 0x34c3af49 "aaa"]]]
app/jobs/your_job.rb
中的
class YourJob < ActiveJob::Base
#specify the name of your queue
queue_as :the_queue
# you must define perform, this is where the async magic happens
def perform(something)
do_stuff_to(something)
end
end
app/models/place_where_job_is_kicked_off.rb
中的
class PlaceWhereJobIsKickedOff
def do_the_jobs
Something.all.each do |something|
# enqueue your jobs to be performed as soon as the queueing system is free. The queue size is set in your sidekiq.yml
# each job will be enqueued and run asynchronously, so watch out for race conditions.
YourJob.perfom_later(something)
end
end
end
app/config/enviroments/production.rb
中的
Rails.application.configure do
#other production configs...
#set the ActiveJob queue adapter to sidekiq
config.active_job.queue_adapter = :sidekiq
#other production configs...
end
确保已在生产服务器上安装并运行Redis,并且正在运行sidekiq 。将sidekiq gem添加到gemfile并捆绑安装后,运行:
app/config/sidekiq.yml
这将启动sidekiq作为守护进程。
答案 2 :(得分:0)
我认为你要找的是sidekiq
宝石。它用于异步运行作业。
http://sidekiq.org