forked from collectiveidea/delayed_job
/
command.rb
105 lines (94 loc) · 3.65 KB
/
command.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
begin
require 'daemons'
rescue LoadError
raise "You need to add gem 'daemons' to your Gemfile if you wish to use it."
end
require 'optparse'
module Delayed
class Command
attr_accessor :worker_count
def initialize(args)
@options = {
:quiet => true,
:pid_dir => "#{Rails.root}/tmp/pids"
}
@worker_count = 1
@monitor = false
opts = OptionParser.new do |opts|
opts.banner = "Usage: #{File.basename($0)} [options] start|stop|restart|run"
opts.on('-h', '--help', 'Show this message') do
puts opts
exit 1
end
opts.on('-e', '--environment=NAME', 'Specifies the environment to run this delayed jobs under (test/development/production).') do |e|
STDERR.puts "The -e/--environment option has been deprecated and has no effect. Use RAILS_ENV and see http://github.com/collectiveidea/delayed_job/issues/#issue/7"
end
opts.on('--min-priority N', 'Minimum priority of jobs to run.') do |n|
@options[:min_priority] = n
end
opts.on('--max-priority N', 'Maximum priority of jobs to run.') do |n|
@options[:max_priority] = n
end
opts.on('-n', '--number_of_workers=workers', "Number of unique workers to spawn") do |worker_count|
@worker_count = worker_count.to_i rescue 1
end
opts.on('--pid-dir=DIR', 'Specifies an alternate directory in which to store the process ids.') do |dir|
@options[:pid_dir] = dir
end
opts.on('-i', '--identifier=n', 'A numeric identifier for the worker.') do |n|
@options[:identifier] = n
end
opts.on('-m', '--monitor', 'Start monitor process.') do
@monitor = true
end
opts.on('--sleep-delay N', "Amount of time to sleep when no jobs are found") do |n|
@options[:sleep_delay] = n
end
opts.on('-p', '--prefix NAME', "String to be prefixed to worker process names") do |prefix|
@options[:prefix] = prefix
end
opts.on('--queues=queues', "Specify which queue DJ must look up for jobs") do |queues|
@options[:queues] = queues.split(',')
end
opts.on('--queue=queue', "Specify which queue DJ must look up for jobs") do |queue|
@options[:queues] = queue.split(',')
end
end
@args = opts.parse!(args)
end
def daemonize
dir = @options[:pid_dir]
Dir.mkdir(dir) unless File.exists?(dir)
if @worker_count > 1 && @options[:identifier]
raise ArgumentError, 'Cannot specify both --number-of-workers and --identifier'
elsif @worker_count == 1 && @options[:identifier]
process_name = "delayed_job.#{@options[:identifier]}"
run_process(process_name, dir)
else
worker_count.times do |worker_index|
process_name = worker_count == 1 ? "delayed_job" : "delayed_job.#{worker_index}"
run_process(process_name, dir)
end
end
end
def run_process(process_name, dir)
Delayed::Worker.before_fork
Daemons.run_proc(process_name, :dir => dir, :dir_mode => :normal, :monitor => @monitor, :ARGV => @args) do |*args|
$0 = File.join(@options[:prefix], process_name) if @options[:prefix]
run process_name
end
end
def run(worker_name = nil)
Dir.chdir(Rails.root)
Delayed::Worker.after_fork
Delayed::Worker.logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log'))
worker = Delayed::Worker.new(@options)
worker.name_prefix = "#{worker_name} "
worker.start
rescue => e
Rails.logger.fatal e
STDERR.puts e.message
exit 1
end
end
end