rabbit_jobs 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/rabbit_jobs/consumer/job_consumer.rb +27 -0
- data/lib/rabbit_jobs/scheduler.rb +1 -19
- data/lib/rabbit_jobs/tasks.rb +2 -1
- data/lib/rabbit_jobs/util.rb +0 -18
- data/lib/rabbit_jobs/version.rb +1 -1
- data/lib/rabbit_jobs/worker.rb +10 -41
- data/lib/rabbit_jobs.rb +1 -0
- data/rabbit_jobs.gemspec +1 -1
- data/spec/integration/scheduler_spec.rb +0 -3
- data/spec/unit/worker_spec.rb +0 -11
- metadata +14 -13
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module RabbitJobs
|
3
|
+
module Consumer
|
4
|
+
class JobConsumer
|
5
|
+
def process_message(metadata, payload)
|
6
|
+
job = RJ::Job.parse(payload)
|
7
|
+
|
8
|
+
if job.is_a?(Symbol)
|
9
|
+
# case @job
|
10
|
+
# when :not_found
|
11
|
+
# when :parsing_error
|
12
|
+
# when :error
|
13
|
+
# end
|
14
|
+
else
|
15
|
+
if job.expired?
|
16
|
+
RJ.logger.warn "Job expired: #{job.to_ruby_string}"
|
17
|
+
false
|
18
|
+
else
|
19
|
+
job.run_perform
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -7,7 +7,7 @@ require 'yaml'
|
|
7
7
|
module RabbitJobs
|
8
8
|
class Scheduler
|
9
9
|
|
10
|
-
attr_accessor :
|
10
|
+
attr_accessor :schedule, :process_name
|
11
11
|
|
12
12
|
def load_default_schedule
|
13
13
|
if defined?(Rails)
|
@@ -106,7 +106,6 @@ module RabbitJobs
|
|
106
106
|
RJ.logger.info "Processed jobs: #{processed_count}."
|
107
107
|
RJ.logger.info "Stopped."
|
108
108
|
|
109
|
-
File.delete(self.pidfile) if self.pidfile && File.exists?(self.pidfile)
|
110
109
|
return true
|
111
110
|
end
|
112
111
|
end
|
@@ -130,27 +129,10 @@ module RabbitJobs
|
|
130
129
|
end
|
131
130
|
|
132
131
|
def startup
|
133
|
-
# prune_dead_workers
|
134
|
-
RabbitJobs::Util.check_pidfile(self.pidfile) if self.pidfile
|
135
|
-
|
136
|
-
if self.background
|
137
|
-
child_pid = fork
|
138
|
-
if child_pid
|
139
|
-
return false
|
140
|
-
else
|
141
|
-
# daemonize child process
|
142
|
-
Process.daemon(true)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
132
|
# Fix buffering so we can `rake rj:work > resque.log` and
|
147
133
|
# get output from the child in there.
|
148
134
|
$stdout.sync = true
|
149
135
|
|
150
|
-
if self.pidfile
|
151
|
-
File.open(self.pidfile, 'w') { |f| f << Process.pid }
|
152
|
-
end
|
153
|
-
|
154
136
|
@shutdown = false
|
155
137
|
|
156
138
|
Signal.trap('TERM') { shutdown }
|
data/lib/rabbit_jobs/tasks.rb
CHANGED
@@ -24,9 +24,10 @@ namespace :rj do
|
|
24
24
|
|
25
25
|
desc "Start a Rabbit Jobs worker"
|
26
26
|
task :worker => :environment do
|
27
|
-
queues = (ENV['QUEUES'] || ENV['
|
27
|
+
queues = (ENV['QUEUES'] || ENV['QUEUE'] || "").split(',')
|
28
28
|
make_dirs
|
29
29
|
worker = RJ::Worker.new(*queues)
|
30
|
+
worker.consumer = RJ::Consumer.const_get(ENV['CONSUMER'].classify).new if ENV['CONSUMER']
|
30
31
|
worker.process_name = "rj_worker #{rails_env} [#{queues.join(',')}]"
|
31
32
|
exit(worker.work)
|
32
33
|
end
|
data/lib/rabbit_jobs/util.rb
CHANGED
@@ -4,24 +4,6 @@ module RabbitJobs
|
|
4
4
|
class Util
|
5
5
|
class << self
|
6
6
|
|
7
|
-
# clean old worker process
|
8
|
-
def check_pidfile(pidfile)
|
9
|
-
if File.exists?(pidfile)
|
10
|
-
pid = File.read(pidfile).to_i
|
11
|
-
begin
|
12
|
-
Process.kill(0, pid)
|
13
|
-
RJ.logger.info "Killing stale rj_worker[##{pid}]"
|
14
|
-
Process.kill("TERM", pid)
|
15
|
-
|
16
|
-
while Process.kill(0, pid)
|
17
|
-
sleep(0.5)
|
18
|
-
end
|
19
|
-
rescue
|
20
|
-
File.delete(pidfile) if File.exists?(pidfile)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
7
|
def cleanup_backtrace(trace_lines)
|
26
8
|
if defined?(Rails) && Rails.respond_to?(:root)
|
27
9
|
rails_root_path = Rails.root.to_s
|
data/lib/rabbit_jobs/version.rb
CHANGED
data/lib/rabbit_jobs/worker.rb
CHANGED
@@ -2,7 +2,13 @@
|
|
2
2
|
|
3
3
|
module RabbitJobs
|
4
4
|
class Worker
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :process_name
|
6
|
+
attr_reader :consumer
|
7
|
+
|
8
|
+
def consumer=(consumer)
|
9
|
+
raise ArgumentError.new("consumer=#{consumer.inspect}") unless consumer.respond_to?(:process_message)
|
10
|
+
@consumer = consumer
|
11
|
+
end
|
6
12
|
|
7
13
|
def amqp_connection
|
8
14
|
Thread.current[:rj_worker_connection] ||= AmqpHelper.prepare_connection
|
@@ -14,27 +20,6 @@ module RabbitJobs
|
|
14
20
|
Thread.current[:rj_worker_connection] = nil
|
15
21
|
end
|
16
22
|
|
17
|
-
def process_message(metadata, payload)
|
18
|
-
job = RJ::Job.parse(payload)
|
19
|
-
|
20
|
-
if job.is_a?(Symbol)
|
21
|
-
# case @job
|
22
|
-
# when :not_found
|
23
|
-
# when :parsing_error
|
24
|
-
# when :error
|
25
|
-
# end
|
26
|
-
else
|
27
|
-
if job.expired?
|
28
|
-
RJ.logger.warn "Job expired: #{job.to_ruby_string}"
|
29
|
-
false
|
30
|
-
else
|
31
|
-
job.run_perform
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
true
|
36
|
-
end
|
37
|
-
|
38
23
|
def queue_name(routing_key)
|
39
24
|
RJ.config.queue_name(routing_key)
|
40
25
|
end
|
@@ -69,6 +54,7 @@ module RabbitJobs
|
|
69
54
|
# Subscribes to queue and working on jobs
|
70
55
|
def work(time = -1)
|
71
56
|
return false unless startup
|
57
|
+
@consumer ||= RJ::Consumer::JobConsumer.new
|
72
58
|
|
73
59
|
$0 = self.process_name || "rj_worker (#{queues.join(', ')})"
|
74
60
|
|
@@ -91,7 +77,8 @@ module RabbitJobs
|
|
91
77
|
queue.subscribe(ack: explicit_ack) do |delivery_info, properties, payload|
|
92
78
|
if RJ.run_before_process_message_callbacks
|
93
79
|
begin
|
94
|
-
|
80
|
+
@consumer.process_message(properties, payload)
|
81
|
+
processed_count += 1
|
95
82
|
rescue
|
96
83
|
RJ.logger.warn "process_message failed. payload: #{payload.inspect}"
|
97
84
|
RJ.logger.warn $!.inspect
|
@@ -123,8 +110,6 @@ module RabbitJobs
|
|
123
110
|
if @shutdown
|
124
111
|
RJ.logger.info "Processed jobs: #{processed_count}."
|
125
112
|
RJ.logger.info "Stopped."
|
126
|
-
|
127
|
-
File.delete(self.pidfile) if self.pidfile && File.exists?(self.pidfile)
|
128
113
|
return true
|
129
114
|
end
|
130
115
|
end
|
@@ -147,24 +132,8 @@ module RabbitJobs
|
|
147
132
|
end
|
148
133
|
|
149
134
|
def startup
|
150
|
-
# prune_dead_workers
|
151
|
-
RabbitJobs::Util.check_pidfile(self.pidfile) if self.pidfile
|
152
|
-
|
153
|
-
if self.background
|
154
|
-
return false if self.worker_pid = fork
|
155
|
-
|
156
|
-
# daemonize child process
|
157
|
-
Process.daemon(true)
|
158
|
-
end
|
159
|
-
|
160
135
|
count = RJ._run_after_fork_callbacks
|
161
136
|
|
162
|
-
self.worker_pid ||= Process.pid
|
163
|
-
|
164
|
-
if self.pidfile
|
165
|
-
File.open(self.pidfile, 'w') { |f| f << Process.pid }
|
166
|
-
end
|
167
|
-
|
168
137
|
$stdout.sync = true
|
169
138
|
|
170
139
|
@shutdown = false
|
data/lib/rabbit_jobs.rb
CHANGED
data/rabbit_jobs.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.require_paths = ["lib"]
|
17
17
|
gem.version = RabbitJobs::VERSION
|
18
18
|
|
19
|
-
gem.add_dependency "bunny", "0.9.0.
|
19
|
+
gem.add_dependency "bunny", "0.9.0.pre8"
|
20
20
|
gem.add_dependency "rake"
|
21
21
|
gem.add_dependency "rufus-scheduler", "~> 2.0"
|
22
22
|
gem.add_dependency "rails", ">= 3.0"
|
@@ -6,9 +6,6 @@ describe RabbitJobs::Scheduler do
|
|
6
6
|
scheduler = RabbitJobs::Scheduler.new
|
7
7
|
scheduler.schedule = YAML.load_file(File.expand_path('../../fixtures/schedule.yml', __FILE__))
|
8
8
|
|
9
|
-
scheduler.pidfile = '/tmp/rj_scheduler.pid'
|
10
|
-
scheduler.background = false
|
11
|
-
|
12
9
|
scheduler.work(10) # work for 1 second
|
13
10
|
|
14
11
|
RJ.config.queue 'default', RJ::Configuration::DEFAULT_QUEUE_PARAMS
|
data/spec/unit/worker_spec.rb
CHANGED
@@ -22,17 +22,6 @@ describe RabbitJobs::Worker do
|
|
22
22
|
@worker.instance_variable_get('@shutdown').should_not == true
|
23
23
|
end
|
24
24
|
|
25
|
-
it '#startup should write process id to file' do
|
26
|
-
mock(Signal).trap('TERM')
|
27
|
-
mock(Signal).trap('INT')
|
28
|
-
|
29
|
-
filename = 'test_worker.pid'
|
30
|
-
mock(File).open(filename, 'w') {}
|
31
|
-
@worker.pidfile = filename
|
32
|
-
@worker.startup
|
33
|
-
@worker.pidfile.should == filename
|
34
|
-
end
|
35
|
-
|
36
25
|
it '#shutdown should set @shutdown to true' do
|
37
26
|
@worker.instance_variable_get('@shutdown').should_not == true
|
38
27
|
@worker.shutdown
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rabbit_jobs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bunny
|
16
|
-
requirement: &
|
16
|
+
requirement: &10601260 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - =
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.9.0.
|
21
|
+
version: 0.9.0.pre8
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *10601260
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &10622000 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *10622000
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rufus-scheduler
|
38
|
-
requirement: &
|
38
|
+
requirement: &10619420 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '2.0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *10619420
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rails
|
49
|
-
requirement: &
|
49
|
+
requirement: &10617700 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '3.0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *10617700
|
58
58
|
description: Background jobs on RabbitMQ
|
59
59
|
email:
|
60
60
|
- lazureykis@gmail.com
|
@@ -74,6 +74,7 @@ files:
|
|
74
74
|
- lib/rabbit_jobs.rb
|
75
75
|
- lib/rabbit_jobs/amqp_helper.rb
|
76
76
|
- lib/rabbit_jobs/configuration.rb
|
77
|
+
- lib/rabbit_jobs/consumer/job_consumer.rb
|
77
78
|
- lib/rabbit_jobs/error_mailer.rb
|
78
79
|
- lib/rabbit_jobs/helpers.rb
|
79
80
|
- lib/rabbit_jobs/job.rb
|
@@ -111,7 +112,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
112
|
version: '0'
|
112
113
|
segments:
|
113
114
|
- 0
|
114
|
-
hash:
|
115
|
+
hash: 2228103642299556651
|
115
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
117
|
none: false
|
117
118
|
requirements:
|
@@ -120,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
121
|
version: '0'
|
121
122
|
segments:
|
122
123
|
- 0
|
123
|
-
hash:
|
124
|
+
hash: 2228103642299556651
|
124
125
|
requirements: []
|
125
126
|
rubyforge_project:
|
126
127
|
rubygems_version: 1.8.11
|