background_bunnies 0.0.2 → 0.0.3

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.
@@ -17,6 +17,7 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
19
  gem.add_dependency "bunny", ">= 0.9.0.pre7"
20
+ gem.add_dependency "amqp"
20
21
  gem.add_development_dependency "rake"
21
22
  gem.add_development_dependency "minitest"
22
23
  end
@@ -1,11 +1,13 @@
1
1
  require 'thread'
2
+ require 'bunny'
3
+ require 'amqp'
2
4
  require_relative 'job'
3
5
 
4
6
  module BackgroundBunnies
5
7
  module Bunny
6
8
 
7
9
  module BunnyConfigurators
8
-
10
+ DEFAULT_CONNECTION_OPTIONS = {:threaded=>true}
9
11
  def group(group_name)
10
12
  @group_name = group_name
11
13
  end
@@ -22,6 +24,14 @@ module BackgroundBunnies
22
24
  @queue_name || demodulized_class_name
23
25
  end
24
26
 
27
+ def connection_options
28
+ @connection_options || DEFAULT_CONNECTION_OPTIONS.dup
29
+ end
30
+
31
+ def connection_options=(options)
32
+ @connection_options
33
+ end
34
+
25
35
  def demodulized_class_name
26
36
  path = name
27
37
  if i = path.rindex('::')
@@ -48,36 +58,41 @@ module BackgroundBunnies
48
58
  self.class.queue_name
49
59
  end
50
60
 
61
+ def connection_options
62
+ self.class.connection_options
63
+ end
64
+
51
65
  attr_reader :channel
52
66
  attr_reader :queue
53
67
  attr_reader :consumer
68
+ attr_reader :exchange
69
+ attr_reader :thread
54
70
 
55
71
  #
56
- # Starts the Worker
72
+ # Starts the Worker with the given connection or group name
57
73
  #
58
- def start(connection)
59
- @channel = connection.create_channel
74
+ def start(connection_or_group)
75
+ @connection = connection_or_group
76
+ @channel = AMQP::Channel.new(@connection)
60
77
  @queue = @channel.queue(queue_name)
61
- @consumer = @queue.subscribe(block: false, ack: true) do |info, properties, payload|
62
- job = Job.new(JSON.parse!(payload), info, properties)
63
- err = nil
78
+ @consumer = @queue.subscribe(:ack=>true) do |metadata, payload|
79
+ info = metadata
80
+ properties = nil
64
81
  begin
82
+ job = Job.new(JSON.parse!(payload), info, properties)
83
+ err = nil
65
84
  self.process(job)
66
- rescue =>e
67
- err = e
68
- end
69
- unless err
70
- @channel.ack(info.delivery_tag, false)
71
- else
85
+ metadata.ack
86
+ rescue =>err
72
87
  # processing went wrong, requeing message
73
- @channel.reject(info.delivery_tag, true)
74
88
  on_error(job, err)
89
+ metadata.reject(:requeue=>true)
75
90
  end
76
91
  end
77
92
  end
78
93
 
79
94
  def on_error(job, err)
80
- log_error "Error processing #{job.info.delivery_tag}: #{err.message}, #{err.backtrace.join('\n')}"
95
+ log_error "Error processing #{job.info.delivery_tag}: #{err.message}, #{err.backtrace.join('\n')}"
81
96
  end
82
97
 
83
98
  def log_error(a)
@@ -3,6 +3,7 @@ module BackgroundBunnies
3
3
  attr_reader :info
4
4
  attr_reader :properties
5
5
  attr_reader :payload
6
+ alias :metadata :info
6
7
 
7
8
  def initialize(payload, info = nil, properties = nil)
8
9
  @info = info
@@ -7,12 +7,8 @@ module BackgroundBunnies
7
7
  attr_reader :queue_name
8
8
  attr_reader :connection
9
9
 
10
- def initialize(connection, queue_name)
11
- if connection.is_a? Symbol
12
- @connection = BackgroundBunnies.connections[connection]
13
- else
14
- @connection = connection
15
- end
10
+ def initialize(connection_or_group, queue_name)
11
+ @connection = BackgroundBunnies.connect connection_or_group
16
12
  @queue_name = queue_name.to_s
17
13
  @channel = @connection.create_channel
18
14
  @queue = @connection.queue(@queue_name)
@@ -1,3 +1,3 @@
1
1
  module BackgroundBunnies
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -5,6 +5,8 @@ require "background_bunnies/producer"
5
5
  require "background_bunnies/job"
6
6
  require "background_bunnies/workers"
7
7
  require "thread"
8
+ require "bunny"
9
+ require "amqp"
8
10
 
9
11
  module BackgroundBunnies
10
12
 
@@ -17,30 +19,51 @@ module BackgroundBunnies
17
19
  @configs || @configs = {}
18
20
  end
19
21
 
20
- alias connections configurations
22
+ DEFAULT_CONNECTION_OPTIONS={:threaded=>false}.freeze
21
23
 
22
24
  #
23
25
  # Configures the connection of a group
24
26
  #
25
- def configure(group, connection)
26
- info "Configuring #{group} connection"
27
- configurations[group] = connection
28
- if connection.status == :not_connected
29
- connection.start
27
+ def configure(group, url, options = DEFAULT_CONNECTION_OPTIONS)
28
+ info "Configuring #{group} connection with #{url} and options #{options}"
29
+ configurations[group] = {
30
+ :url=>url,
31
+ :options=>options
32
+ }
33
+ end
34
+
35
+ #
36
+ # Creates a new connection based on a group configuration
37
+ #
38
+ def connect(connection_or_group, options=DEFAULT_CONNECTION_OPTIONS)
39
+ unless connection_or_group.is_a? Symbol
40
+ return connection_or_group
30
41
  end
42
+ configuration = self.configurations[connection_or_group] || DEFAULT_CONNECTION_OPTIONS
43
+ configuration = configuration.dup.merge!(options)
44
+ raise "Unable to connect. Missing configuration for group #{connection_or_group}" unless configuration
45
+ conn = ::Bunny.new(configuration[:url], configuration[:options])
46
+ conn.start
47
+ conn
31
48
  end
32
49
 
33
50
  #
34
51
  # Runs all the tasks in the given group and waits.
35
52
  #
36
53
  def run(group)
37
- connection = configurations[group]
38
54
  klasses = describe_group(group)
39
- info "Running #{group} workers: #{ klasses.join(',') }"
40
- klasses.each do |klass|
41
- instance = klass.new
42
- instance.start connection
43
- info "Started worker: #{klass.demodulized_class_name}"
55
+ instances = []
56
+ EventMachine.run do
57
+ url = configurations[group][:url]
58
+ puts "Group Connection: #{url}"
59
+ connection = AMQP.connect(url)
60
+ info "Running #{group} workers: #{ klasses.join(',') }"
61
+ klasses.each do |klass|
62
+ instance = klass.new
63
+ instance.start connection
64
+ info "Started worker: #{klass.demodulized_class_name}"
65
+ instances << instance
66
+ end
44
67
  end
45
68
  Thread.current.join
46
69
  end
@@ -130,6 +130,12 @@ describe BackgroundBunnies::Bunny do
130
130
  self.delivery_tag = delivery_tag
131
131
  end
132
132
 
133
+ attr_accessor :rejected
134
+
135
+ def reject(delivery_tag, multiple)
136
+ @rejected = true
137
+ end
138
+
133
139
  end
134
140
  channel_klass.new
135
141
  end
@@ -143,6 +149,7 @@ describe BackgroundBunnies::Bunny do
143
149
  worker = StartTest.new
144
150
  worker.start connection
145
151
  worker.channel.delivery_tag.must_be_nil
152
+ worker.channel.rejected.must_be :==, true
146
153
  end
147
154
  end
148
155
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: background_bunnies
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-02 00:00:00.000000000 Z
12
+ date: 2013-04-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bunny
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: 0.9.0.pre7
30
+ - !ruby/object:Gem::Dependency
31
+ name: amqp
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: rake
32
48
  requirement: !ruby/object:Gem::Requirement