rabbit_jobs 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/lib/rabbit_jobs/amqp_helpers.rb +18 -9
- data/lib/rabbit_jobs/job.rb +15 -15
- data/lib/rabbit_jobs/publisher.rb +40 -8
- data/lib/rabbit_jobs/version.rb +1 -1
- data/lib/rabbit_jobs.rb +4 -4
- data/rabbit_jobs.gemspec +1 -0
- data/spec/fixtures/schedule.yml +2 -2
- data/spec/integration/publisher_spec.rb +2 -2
- data/spec/integration/worker_spec.rb +9 -3
- metadata +18 -7
data/Gemfile
CHANGED
@@ -7,18 +7,27 @@ module RabbitJobs
|
|
7
7
|
def amqp_with_exchange(&block)
|
8
8
|
raise ArgumentError unless block
|
9
9
|
|
10
|
-
AMQP.
|
11
|
-
|
12
|
-
|
13
|
-
channel.on_error do |ch, channel_close|
|
14
|
-
puts "Channel-level error: #{channel_close.reply_text}, shutting down..."
|
15
|
-
connection.close { EM.stop }
|
16
|
-
end
|
17
|
-
|
10
|
+
connection = AMQP.connection
|
11
|
+
if connection && connection.open?
|
12
|
+
channel = AMQP::Channel.new(connection)
|
18
13
|
exchange = channel.direct(RJ.config[:exchange], RJ.config[:exchange_params])
|
19
|
-
|
20
14
|
# go work
|
21
15
|
block.call(connection, exchange)
|
16
|
+
|
17
|
+
else
|
18
|
+
AMQP.start(host: RJ.config.host) do |connection|
|
19
|
+
|
20
|
+
channel = AMQP::Channel.new(connection)
|
21
|
+
|
22
|
+
channel.on_error do |ch, channel_close|
|
23
|
+
puts "Channel-level error: #{channel_close.reply_text}, shutting down..."
|
24
|
+
connection.close { EM.stop }
|
25
|
+
end
|
26
|
+
|
27
|
+
exchange = channel.direct(RJ.config[:exchange], RJ.config[:exchange_params])
|
28
|
+
# go work
|
29
|
+
block.call(connection, exchange)
|
30
|
+
end
|
22
31
|
end
|
23
32
|
end
|
24
33
|
|
data/lib/rabbit_jobs/job.rb
CHANGED
@@ -10,7 +10,7 @@ module RabbitJobs::Job
|
|
10
10
|
base.extend (ClassMethods)
|
11
11
|
|
12
12
|
def initialize(*perform_params)
|
13
|
-
self.params =
|
13
|
+
self.params = perform_params
|
14
14
|
self.opts = {}
|
15
15
|
end
|
16
16
|
|
@@ -35,10 +35,10 @@ module RabbitJobs::Job
|
|
35
35
|
self.class.perform(*params)
|
36
36
|
# RJ.logger.debug 'after perform'
|
37
37
|
rescue
|
38
|
-
RJ.logger.warn(
|
39
|
-
|
40
|
-
|
38
|
+
RJ.logger.warn(self.inspect)
|
39
|
+
RJ.logger.warn([$!.inspect, $!.backtrace.to_a].join("\n"))
|
41
40
|
run_on_error_hooks($!)
|
41
|
+
RabbitJobs::ErrorMailer.send(self, $!)
|
42
42
|
end
|
43
43
|
exit!
|
44
44
|
end
|
@@ -47,17 +47,18 @@ module RabbitJobs::Job
|
|
47
47
|
def run_on_error_hooks(error)
|
48
48
|
if self.class.rj_on_error_hooks
|
49
49
|
self.class.rj_on_error_hooks.each do |proc_or_symbol|
|
50
|
+
proc = proc_or_symbol
|
50
51
|
if proc_or_symbol.is_a?(Symbol)
|
51
|
-
self.
|
52
|
+
proc = self.method(proc_or_symbol)
|
53
|
+
end
|
54
|
+
|
55
|
+
case proc.arity
|
56
|
+
when 0
|
57
|
+
proc.call()
|
58
|
+
when 1
|
59
|
+
proc.call(error)
|
52
60
|
else
|
53
|
-
|
54
|
-
when 0
|
55
|
-
proc_or_symbol.call()
|
56
|
-
when 1
|
57
|
-
proc_or_symbol.call(error)
|
58
|
-
else
|
59
|
-
proc_or_symbol.call(error, *params)
|
60
|
-
end
|
61
|
+
proc.call(error, *params)
|
61
62
|
end
|
62
63
|
end
|
63
64
|
end
|
@@ -65,7 +66,6 @@ module RabbitJobs::Job
|
|
65
66
|
|
66
67
|
def payload
|
67
68
|
{'class' => self.class.to_s, 'opts' => (self.opts || {}), 'params' => params}.to_json
|
68
|
-
# ([self.class.to_s] + params).to_json
|
69
69
|
end
|
70
70
|
|
71
71
|
def expires_in
|
@@ -108,7 +108,7 @@ module RabbitJobs::Job
|
|
108
108
|
begin
|
109
109
|
encoded = JSON.parse(payload)
|
110
110
|
job_klass = constantize(encoded['class'])
|
111
|
-
job = job_klass.new(*encoded['params'])
|
111
|
+
job = encoded['params'].count > 0 ? job_klass.new(*encoded['params']) : job_klass.new
|
112
112
|
job.opts = encoded['opts']
|
113
113
|
job
|
114
114
|
rescue
|
@@ -3,23 +3,56 @@
|
|
3
3
|
require 'json'
|
4
4
|
require 'amqp'
|
5
5
|
require 'eventmachine'
|
6
|
+
require 'bunny'
|
6
7
|
|
7
8
|
module RabbitJobs
|
8
9
|
module Publisher
|
9
10
|
extend self
|
10
11
|
extend AmqpHelpers
|
11
12
|
|
12
|
-
def publish(klass,
|
13
|
+
def publish(klass, *params)
|
13
14
|
key = RJ.config.routing_keys.first
|
14
|
-
publish_to(key, klass,
|
15
|
+
publish_to(key, klass, *params)
|
15
16
|
end
|
16
17
|
|
17
|
-
def publish_to(routing_key, klass,
|
18
|
-
raise ArgumentError unless klass && routing_key && klass.is_a?(Class)
|
19
|
-
opts ||= {}
|
18
|
+
def publish_to(routing_key, klass, *params)
|
19
|
+
raise ArgumentError unless klass && routing_key && klass.is_a?(Class) && (routing_key.is_a?(Symbol) || routing_key.is_a?(String))
|
20
20
|
|
21
21
|
job = klass.new(*params)
|
22
|
-
job.opts =
|
22
|
+
job.opts = {'created_at' => Time.now.to_i}
|
23
|
+
|
24
|
+
b = Bunny.new(host: RJ.config.host, logging: false)
|
25
|
+
b.start
|
26
|
+
|
27
|
+
exchange = b.exchange(RJ.config[:exchange], RJ.config[:exchange_params])
|
28
|
+
queue = b.queue(RJ.config.queue_name(routing_key), RJ.config[:queues][routing_key.to_s])
|
29
|
+
queue.bind(exchange)
|
30
|
+
|
31
|
+
exchange.publish(job.payload, Configuration::DEFAULT_MESSAGE_PARAMS.merge({key: routing_key.to_s}))
|
32
|
+
b.stop
|
33
|
+
end
|
34
|
+
|
35
|
+
def purge_queue(*routing_keys)
|
36
|
+
raise ArgumentError unless routing_keys && routing_keys.count > 0
|
37
|
+
|
38
|
+
b = Bunny.new(host: RJ.config.host, logging: false)
|
39
|
+
b.start
|
40
|
+
|
41
|
+
messages_count = 0
|
42
|
+
routing_keys.each do |routing_key|
|
43
|
+
queue = b.queue(RJ.config.queue_name(routing_key), RJ.config[:queues][routing_key.to_s])
|
44
|
+
messages_count += queue.status[:message_count]
|
45
|
+
queue.purge
|
46
|
+
end
|
47
|
+
b.stop
|
48
|
+
return messages_count
|
49
|
+
end
|
50
|
+
|
51
|
+
def publish_to2(routing_key, klass, *params)
|
52
|
+
raise ArgumentError unless klass && routing_key && klass.is_a?(Class) && (routing_key.is_a?(Hash) || routing_key.is_a?(String))
|
53
|
+
|
54
|
+
job = klass.new(*params)
|
55
|
+
job.opts = {}
|
23
56
|
|
24
57
|
dont_stop_em = defined?(EM) && EM.reactor_running?
|
25
58
|
dont_close_connection = AMQP.connection && AMQP.connection.open?
|
@@ -41,7 +74,7 @@ module RabbitJobs
|
|
41
74
|
end
|
42
75
|
end
|
43
76
|
|
44
|
-
def
|
77
|
+
def purge_queue2(*routing_keys)
|
45
78
|
raise ArgumentError unless routing_keys && routing_keys.count > 0
|
46
79
|
|
47
80
|
dont_stop_em = defined?(EM) && EM.reactor_running?
|
@@ -55,7 +88,6 @@ module RabbitJobs
|
|
55
88
|
routing_key = routing_key.to_s
|
56
89
|
queue = exchange.channel.queue(RabbitJobs.config.queue_name(routing_key), RabbitJobs.config[:queues][routing_key])
|
57
90
|
queue.bind(exchange, :routing_key => routing_key)
|
58
|
-
|
59
91
|
queue.status do |number_of_messages, number_of_consumers|
|
60
92
|
messages_count += number_of_messages
|
61
93
|
queue.purge {
|
data/lib/rabbit_jobs/version.rb
CHANGED
data/lib/rabbit_jobs.rb
CHANGED
@@ -17,12 +17,12 @@ require 'logger'
|
|
17
17
|
module RabbitJobs
|
18
18
|
extend self
|
19
19
|
|
20
|
-
def publish(klass,
|
21
|
-
RabbitJobs::Publisher.publish(klass,
|
20
|
+
def publish(klass, *params)
|
21
|
+
RabbitJobs::Publisher.publish(klass, *params)
|
22
22
|
end
|
23
23
|
|
24
|
-
def publish_to(routing_key, klass,
|
25
|
-
RabbitJobs::Publisher.publish_to(routing_key, klass,
|
24
|
+
def publish_to(routing_key, klass, *params)
|
25
|
+
RabbitJobs::Publisher.publish_to(routing_key, klass, *params)
|
26
26
|
end
|
27
27
|
|
28
28
|
attr_writer :logger
|
data/rabbit_jobs.gemspec
CHANGED
data/spec/fixtures/schedule.yml
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
do_a_job:
|
2
2
|
cron: "* * * * *" # run every minute
|
3
3
|
queue: queue_name
|
4
|
-
class:
|
4
|
+
class: TestJob
|
5
5
|
args: "string to be passed to MyJobClass.perform"
|
6
6
|
description: "Description is not supported yet"
|
7
7
|
|
8
8
|
another_job:
|
9
9
|
every: 1h # run every 1 hour
|
10
10
|
queue: queue_name
|
11
|
-
class:
|
11
|
+
class: TestJob
|
12
12
|
args: "string to be passed to MyJobClass.perform"
|
13
13
|
description: "Description is not supported yet"
|
@@ -16,7 +16,7 @@ describe RabbitJobs::Publisher do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'should publish message to queue' do
|
19
|
-
RabbitJobs.publish(TestJob,
|
19
|
+
RabbitJobs.publish(TestJob, 'some', 'other', 'params')
|
20
20
|
RabbitJobs::Publisher.purge_queue('rspec_queue').should == 1
|
21
21
|
end
|
22
22
|
|
@@ -33,7 +33,7 @@ describe RabbitJobs::Publisher do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'should publish job with *params' do
|
36
|
-
RabbitJobs.publish_to(:rspec_queue, JobWithArgsArray,
|
36
|
+
RabbitJobs.publish_to(:rspec_queue, JobWithArgsArray, 'first value', :some_symbol, 123, 'and string')
|
37
37
|
RabbitJobs::Publisher.purge_queue(:rspec_queue).should == 1
|
38
38
|
end
|
39
39
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
require 'spec_helper'
|
3
|
-
|
3
|
+
require 'timecop'
|
4
4
|
require 'eventmachine'
|
5
|
+
|
5
6
|
describe RabbitJobs::Worker do
|
6
7
|
it 'should listen for messages' do
|
7
8
|
RabbitJobs.configure do |c|
|
@@ -9,12 +10,15 @@ describe RabbitJobs::Worker do
|
|
9
10
|
c.queue 'rspec_durable_queue', auto_delete: false, durable: true, ack: true
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
RJ::Publisher.purge_queue('rspec_durable_queue')
|
14
|
+
|
15
|
+
5.times { RabbitJobs.publish(PrintTimeJob, Time.now) }
|
16
|
+
Timecop.freeze(Time.now - 4600) { 5.times { RabbitJobs.publish(JobWithExpire) } }
|
14
17
|
1.times { RabbitJobs.publish(JobWithErrorHook) }
|
15
18
|
worker = RabbitJobs::Worker.new
|
16
19
|
|
17
20
|
worker.work(1) # work for 1 second
|
21
|
+
RJ::Publisher.purge_queue('rspec_durable_queue')
|
18
22
|
end
|
19
23
|
|
20
24
|
it 'should allow to publish jobs from worker' do
|
@@ -23,6 +27,8 @@ describe RabbitJobs::Worker do
|
|
23
27
|
c.queue 'rspec_durable_queue', auto_delete: false, durable: true, ack: true
|
24
28
|
end
|
25
29
|
|
30
|
+
RJ::Publisher.purge_queue('rspec_durable_queue')
|
31
|
+
|
26
32
|
RabbitJobs.publish(JobWithPublish)
|
27
33
|
worker = RabbitJobs::Worker.new
|
28
34
|
|
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.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-03-05 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: amqp
|
16
|
-
requirement: &
|
16
|
+
requirement: &70362685237960 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,21 @@ dependencies:
|
|
21
21
|
version: '0.9'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70362685237960
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: bunny
|
27
|
+
requirement: &70362685237460 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0.7'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70362685237460
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: rake
|
27
|
-
requirement: &
|
38
|
+
requirement: &70362685237080 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ! '>='
|
@@ -32,10 +43,10 @@ dependencies:
|
|
32
43
|
version: '0'
|
33
44
|
type: :runtime
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *70362685237080
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: rufus-scheduler
|
38
|
-
requirement: &
|
49
|
+
requirement: &70362685236540 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ~>
|
@@ -43,7 +54,7 @@ dependencies:
|
|
43
54
|
version: '2.0'
|
44
55
|
type: :runtime
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *70362685236540
|
47
58
|
description: Background jobs on RabbitMQ
|
48
59
|
email:
|
49
60
|
- lazureykis@gmail.com
|