activemessaging 0.12.1 → 0.12.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f05d43c09bd5e33636c4b916952a0036c299b904
4
+ data.tar.gz: 2a073f54521759315dda76d0434872f1f96d8732
5
+ SHA512:
6
+ metadata.gz: 598a0605d67d4a904a855341ac2c49f15fc0fc3ca36eb287eab8b94aacf57da122aba9f01516e78efeaa0ee6f55ccebd713bcfdab05ee637acff6e67850c5112
7
+ data.tar.gz: 6b8ae9feed2d6c89929951e665e4eecfb937cc722377249b5a67e483900424fbd07514a2f4f94dff894d2a26d6f89211516cbf0e55db46743f2b36ae46bdb1e8
data/Gemfile CHANGED
@@ -13,4 +13,7 @@ end
13
13
  gem 'jruby-activemq', :group => :test, :platform => :jruby
14
14
  gem 'appraisal', :group => :test
15
15
 
16
+ gem 'jeweler', :group => :development
17
+
18
+
16
19
  gemspec :development_group => :test
@@ -1,37 +1,78 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- activemessaging (0.12.1)
4
+ activemessaging (0.12.2)
5
5
  activemessaging
6
6
  activesupport (>= 2.3.11)
7
7
 
8
8
  GEM
9
9
  remote: http://rubygems.org/
10
10
  specs:
11
- activesupport (3.2.8)
12
- i18n (~> 0.6)
13
- multi_json (~> 1.0)
11
+ activesupport (4.0.5)
12
+ i18n (~> 0.6, >= 0.6.9)
13
+ minitest (~> 4.2)
14
+ multi_json (~> 1.3)
15
+ thread_safe (~> 0.1)
16
+ tzinfo (~> 0.3.37)
17
+ addressable (2.3.6)
14
18
  appraisal (0.4.1)
15
19
  bundler
16
20
  rake
21
+ builder (3.2.2)
17
22
  celluloid (0.12.0)
18
23
  timers (>= 1.0.0)
19
- git (1.2.5)
20
- i18n (0.6.1)
21
- jeweler (1.8.4)
22
- bundler (~> 1.0)
24
+ descendants_tracker (0.0.4)
25
+ thread_safe (~> 0.3, >= 0.3.1)
26
+ faraday (0.9.0)
27
+ multipart-post (>= 1.2, < 3)
28
+ git (1.2.6)
29
+ github_api (0.11.3)
30
+ addressable (~> 2.3)
31
+ descendants_tracker (~> 0.0.1)
32
+ faraday (~> 0.8, < 0.10)
33
+ hashie (>= 1.2)
34
+ multi_json (>= 1.7.5, < 2.0)
35
+ nokogiri (~> 1.6.0)
36
+ oauth2
37
+ hashie (3.0.0)
38
+ highline (1.6.21)
39
+ i18n (0.6.9)
40
+ jeweler (2.0.1)
41
+ builder
42
+ bundler (>= 1.0)
23
43
  git (>= 1.2.5)
44
+ github_api
45
+ highline (>= 1.6.15)
46
+ nokogiri (>= 1.5.10)
24
47
  rake
25
48
  rdoc
26
49
  jruby-activemq (5.5.1-java)
27
- json (1.7.4)
28
- json (1.7.4-java)
29
- multi_json (1.3.6)
30
- rake (0.9.2.2)
31
- rdoc (3.12)
50
+ json (1.8.1)
51
+ json (1.8.1-java)
52
+ jwt (1.0.0)
53
+ mini_portile (0.6.0)
54
+ minitest (4.7.5)
55
+ multi_json (1.10.1)
56
+ multi_xml (0.5.5)
57
+ multipart-post (2.0.0)
58
+ nokogiri (1.6.2.1)
59
+ mini_portile (= 0.6.0)
60
+ nokogiri (1.6.2.1-java)
61
+ oauth2 (0.9.4)
62
+ faraday (>= 0.8, < 0.10)
63
+ jwt (~> 1.0)
64
+ multi_json (~> 1.3)
65
+ multi_xml (~> 0.5)
66
+ rack (~> 1.2)
67
+ rack (1.5.2)
68
+ rake (10.3.2)
69
+ rdoc (4.1.1)
32
70
  json (~> 1.4)
33
71
  stomp (1.2.4)
72
+ thread_safe (0.3.4)
73
+ thread_safe (0.3.4-java)
34
74
  timers (1.0.1)
75
+ tzinfo (0.3.39)
35
76
 
36
77
  PLATFORMS
37
78
  java
data/README.md CHANGED
@@ -13,6 +13,12 @@ Here's a sample of a processor class that handles incoming messages:
13
13
  end
14
14
  end
15
15
 
16
+ # Generating with Rails 3
17
+
18
+ After adding ActiveMessaging to your Gemfile and executing bundle install, run the following commands:
19
+
20
+ rails g active_messaging:install
21
+ rails g active_messaging:processor <NameOfYourProcessor>
16
22
 
17
23
  # Support
18
24
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.12.1
1
+ 0.12.2
@@ -2,14 +2,15 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
+ # stub: activemessaging 0.12.2 ruby lib
5
6
 
6
7
  Gem::Specification.new do |s|
7
8
  s.name = "activemessaging"
8
- s.version = "0.12.1"
9
+ s.version = "0.12.2"
9
10
 
10
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
12
  s.authors = ["Jon Tirsen", "Andrew Kuklewicz", "Olle Jonsson", "Sylvain Perez", "Cliff Moon", "Uwe Kubosch", "Lance Cooper", "Matt Campbell"]
12
- s.date = "2012-09-28"
13
+ s.date = "2014-06-05"
13
14
  s.description = "ActiveMessaging is an attempt to bring the simplicity and elegance of rails development to the world of messaging. Messaging, (or event-driven architecture) is widely used for enterprise integration, with frameworks such as Java's JMS, and products such as ActiveMQ, Tibco, IBM MQSeries, etc. Now supporting Rails 3 as of version 0.8.0."
14
15
  s.email = "activemessaging-discuss@googlegroups.com"
15
16
  s.extra_rdoc_files = [
@@ -109,20 +110,22 @@ Gem::Specification.new do |s|
109
110
  ]
110
111
  s.homepage = "http://github.com/kookster/activemessaging"
111
112
  s.require_paths = ["lib"]
112
- s.rubygems_version = "1.8.22"
113
+ s.rubygems_version = "2.1.11"
113
114
  s.summary = "Official activemessaging gem, now hosted on github.com/kookster. (kookster prefix temporary)"
114
115
 
115
116
  if s.respond_to? :specification_version then
116
- s.specification_version = 3
117
+ s.specification_version = 4
117
118
 
118
119
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
119
120
  s.add_runtime_dependency(%q<activemessaging>, [">= 0"])
121
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
120
122
  s.add_runtime_dependency(%q<activesupport>, [">= 2.3.11"])
121
123
  s.add_development_dependency(%q<jeweler>, [">= 0"])
122
124
  s.add_development_dependency(%q<stomp>, [">= 0"])
123
125
  s.add_development_dependency(%q<appraisal>, [">= 0"])
124
126
  else
125
127
  s.add_dependency(%q<activemessaging>, [">= 0"])
128
+ s.add_dependency(%q<jeweler>, [">= 0"])
126
129
  s.add_dependency(%q<activesupport>, [">= 2.3.11"])
127
130
  s.add_dependency(%q<jeweler>, [">= 0"])
128
131
  s.add_dependency(%q<stomp>, [">= 0"])
@@ -130,6 +133,7 @@ Gem::Specification.new do |s|
130
133
  end
131
134
  else
132
135
  s.add_dependency(%q<activemessaging>, [">= 0"])
136
+ s.add_dependency(%q<jeweler>, [">= 0"])
133
137
  s.add_dependency(%q<activesupport>, [">= 2.3.11"])
134
138
  s.add_dependency(%q<jeweler>, [">= 0"])
135
139
  s.add_dependency(%q<stomp>, [">= 0"])
@@ -1,7 +1,7 @@
1
1
  PATH
2
- remote: /Users/LCooper/src/activemessaging
2
+ remote: ..
3
3
  specs:
4
- activemessaging (0.10.0)
4
+ activemessaging (0.12.1)
5
5
  activemessaging
6
6
  activesupport (>= 2.3.11)
7
7
  celluloid
@@ -1,7 +1,7 @@
1
1
  PATH
2
- remote: /Users/LCooper/src/activemessaging
2
+ remote: ..
3
3
  specs:
4
- activemessaging (0.10.0)
4
+ activemessaging (0.12.1)
5
5
  activemessaging
6
6
  activesupport (>= 2.3.11)
7
7
  celluloid
@@ -1,7 +1,7 @@
1
1
  PATH
2
- remote: /Users/LCooper/src/activemessaging
2
+ remote: ..
3
3
  specs:
4
- activemessaging (0.10.0)
4
+ activemessaging (0.12.1)
5
5
  activemessaging
6
6
  activesupport (>= 2.3.11)
7
7
  celluloid
@@ -1,7 +1,7 @@
1
1
  PATH
2
- remote: /Users/LCooper/src/activemessaging
2
+ remote: ..
3
3
  specs:
4
- activemessaging (0.10.0)
4
+ activemessaging (0.12.1)
5
5
  activemessaging
6
6
  activesupport (>= 2.3.11)
7
7
  celluloid
@@ -14,12 +14,12 @@ module ActiveMessaging
14
14
  class StopProcessingException < Interrupt #:nodoc:
15
15
  end
16
16
 
17
- # Used to indicate that the processing on a message should cease,
17
+ # Used to indicate that the processing on a message should cease,
18
18
  # and the message should be returned back to the broker as best it can be
19
19
  class AbortMessageException < Exception #:nodoc:
20
20
  end
21
21
 
22
- # Used to indicate that the processing on a message should cease,
22
+ # Used to indicate that the processing on a message should cease,
23
23
  # but no further action is required
24
24
  class StopFilterException < Exception #:nodoc:
25
25
  end
@@ -46,15 +46,14 @@ module ActiveMessaging
46
46
  def self.load_extensions
47
47
  require 'logger'
48
48
  require 'activemessaging/gateway'
49
- require 'activemessaging/threaded_poller'
50
49
  require 'activemessaging/adapter'
51
50
  require 'activemessaging/message_sender'
52
51
  require 'activemessaging/processor'
53
52
  require 'activemessaging/filter'
54
53
  require 'activemessaging/trace_filter'
55
54
 
56
- # load all under the adapters dir
57
- Dir[File.join(ROOT, 'lib', 'activemessaging', 'adapters', '*.rb')].each do |a|
55
+ # load all under the adapters dir
56
+ Dir[File.join(ROOT, 'lib', 'activemessaging', 'adapters', '*.rb')].each do |a|
58
57
  begin
59
58
  adapter_name = File.basename(a, ".rb")
60
59
  require 'activemessaging/adapters/' + adapter_name
@@ -65,9 +64,15 @@ module ActiveMessaging
65
64
  end
66
65
 
67
66
  def self.load_config
67
+ # Skip loading config if there are no custom processors as the generator
68
+ # is likely running since application_processor.rb and another processor
69
+ # should exist when running rails.
70
+ if Dir["#{app_root}/app/processors/*.rb"].size() <= 1
71
+ return
72
+ end
68
73
  path = File.expand_path("#{app_root}/config/messaging.rb")
69
74
  begin
70
- load path
75
+ load path
71
76
  rescue
72
77
  raise $!, " ActiveMessaging: problems trying to load '#{path}': \n\t#{$!.message}"
73
78
  end
@@ -106,7 +111,7 @@ module ActiveMessaging
106
111
  err_msg = <<-EOM
107
112
 
108
113
  ActiveMessaging Error: No subscriptions.
109
-
114
+
110
115
  If you have no processor classes in app/processors, add them using the command:
111
116
  script/generate processor DoSomething"
112
117
 
@@ -61,7 +61,7 @@ module ActiveMessaging
61
61
 
62
62
  @queue_config = DEFAULT_QUEUE_CONFIG
63
63
  unless @auto_generated_queue
64
- @queue_config.merge({
64
+ @queue_config.merge!({
65
65
  :durable => !!config[:queue_durable],
66
66
  :auto_delete => !!config[:queue_auto_delete],
67
67
  :exclusive => !!config[:queue_exclusive]
@@ -80,10 +80,19 @@ module ActiveMessaging
80
80
 
81
81
  def received message, headers={}
82
82
  #check to see if the ack mode for this subscription is auto or client
83
- # if the ack mode is client, send an ack
84
- if (headers[:ack] === 'client')
83
+ # if the ack mode is client or client-individual, send an ack
84
+ if (headers[:ack] === 'client' || headers[:ack] === 'client-individual')
85
85
  ack_headers = message.headers.has_key?(:transaction) ? { :transaction=>message.headers[:transaction]} : {}
86
- @stomp_connection.ack(message.headers['message-id'], ack_headers)
86
+ # All 3 protocol levels have unique ACK requirements.
87
+ case @stomp_connection.protocol
88
+ when ::Stomp::SPL_10
89
+ @stomp_connection.ack(message.headers['message-id'], ack_headers)
90
+ when ::Stomp::SPL_11
91
+ ack_headers['subscription'] = message.headers['subscription']
92
+ @stomp_connection.ack(message.headers['message-id'], ack_headers)
93
+ else # avoid ::Stomp::SPL_12 constant when using older Stomp gems
94
+ @stomp_connection.ack(message.headers['ack'], ack_headers)
95
+ end
87
96
  end
88
97
  end
89
98
 
@@ -6,7 +6,7 @@ require 'thread'
6
6
  module ActiveMessaging
7
7
 
8
8
  class Gateway
9
-
9
+
10
10
  @adapters = {}
11
11
  @subscriptions = {}
12
12
  @named_destinations = {}
@@ -61,7 +61,7 @@ module ActiveMessaging
61
61
  ActiveMessaging.logger.error "ActiveMessaging: thread[#{name}]: receive loop terminated"
62
62
  end
63
63
  end
64
-
64
+
65
65
  while @running
66
66
  trap("TERM", "EXIT")
67
67
  living = false
@@ -71,7 +71,7 @@ module ActiveMessaging
71
71
  end
72
72
  ActiveMessaging.logger.error "All connection threads have died..."
73
73
  rescue Interrupt
74
- ActiveMessaging.logger.error "\n<<Interrupt received>>\n"
74
+ ActiveMessaging.logger.error "\n<<Interrupt received>>\n"
75
75
  rescue Object=>exception
76
76
  ActiveMessaging.logger.error "#{exception.class.name}: #{exception.message}\n\t#{exception.backtrace.join("\n\t")}"
77
77
  raise exception
@@ -80,11 +80,11 @@ module ActiveMessaging
80
80
  stop
81
81
  ActiveMessaging.logger.error "=> END"
82
82
  end
83
-
83
+
84
84
  def stop
85
85
  # first tell the threads to stop their looping, so they'll stop when next complete a receive/dispatch cycle
86
86
  @running = false
87
-
87
+
88
88
  # if they are dispatching (i.e. !thread[:message].nil?), wait for them to finish
89
89
  # if they are receiving (i.e. thread[:message].nil?), stop them by raising exception
90
90
  dispatching = true
@@ -118,7 +118,7 @@ module ActiveMessaging
118
118
  unsubscribe
119
119
  disconnect
120
120
  end
121
-
121
+
122
122
  def connection broker_name='default'
123
123
  return @connections[broker_name] if @connections.has_key?(broker_name)
124
124
  config = load_connection_configuration(broker_name)
@@ -130,12 +130,12 @@ module ActiveMessaging
130
130
  def register_adapter adapter_name, adapter_class
131
131
  Gateway.adapters[adapter_name] = adapter_class
132
132
  end
133
-
133
+
134
134
  def filter filter, options = {}
135
135
  options[:direction] = :bidirectional if options[:direction].nil?
136
136
  filters << [filter, options]
137
137
  end
138
-
138
+
139
139
  def subscribe
140
140
  subscriptions.each { |key, subscription| subscription.subscribe }
141
141
  end
@@ -163,7 +163,7 @@ module ActiveMessaging
163
163
  end
164
164
  yield(message)
165
165
  end
166
-
166
+
167
167
  def apply_filter?(direction, details, options)
168
168
  # check that it is the correct direction
169
169
  result = if direction.to_sym == options[:direction] || options[:direction] == :bidirectional
@@ -201,14 +201,18 @@ module ActiveMessaging
201
201
  end
202
202
 
203
203
  def prepare_application
204
- if defined? ActiveRecord
204
+ return unless defined?(ActiveRecord)
205
+
206
+ if ActiveRecord::VERSION::MAJOR >= 4
207
+ ActiveRecord::Base.connection_pool.connections.map(&:verify!)
208
+ else
205
209
  ActiveRecord::Base.verify_active_connections!
206
210
  end
207
211
  end
208
212
 
209
213
  def reset_application
210
214
  end
211
-
215
+
212
216
  def dispatch(message)
213
217
  prepare_application
214
218
  _dispatch(message)
@@ -225,11 +229,11 @@ module ActiveMessaging
225
229
  abort = false
226
230
  processed = false
227
231
 
228
- subscriptions.each do |key, subscription|
232
+ subscriptions.each do |key, subscription|
229
233
  if message.matches_subscription?(subscription) then
230
234
  processed = true
231
235
  routing = {
232
- :receiver => subscription.processor_class,
236
+ :receiver => subscription.processor_class,
233
237
  :destination => subscription.destination,
234
238
  :direction => :incoming
235
239
  }
@@ -271,9 +275,9 @@ module ActiveMessaging
271
275
  raise "You already defined #{destination_name} to #{named_destinations[destination_name].value}" if named_destinations.has_key?(destination_name)
272
276
  named_destinations[destination_name] = Destination.new(destination_name, destination, publish_headers, broker)
273
277
  end
274
-
278
+
275
279
  alias queue destination
276
-
280
+
277
281
  def find_destination destination_name
278
282
  real_destination = named_destinations[destination_name]
279
283
  raise "You have not yet defined a destination named #{destination_name}. Destinations currently defined are [#{named_destinations.keys.join(',')}]" if real_destination.nil?
@@ -293,10 +297,10 @@ module ActiveMessaging
293
297
  def publish destination_name, body, publisher=nil, headers={}, timeout=10
294
298
  raise "You cannot have a nil or empty destination name." if destination_name.nil?
295
299
  raise "You cannot have a nil or empty message body." if (body.nil? || body.empty?)
296
-
300
+
297
301
  real_destination = find_destination(destination_name)
298
302
  details = {
299
- :publisher => publisher,
303
+ :publisher => publisher,
300
304
  :destination => real_destination,
301
305
  :direction => :outgoing
302
306
  }
@@ -312,13 +316,13 @@ module ActiveMessaging
312
316
  raise toe
313
317
  end
314
318
  end
315
-
319
+
316
320
  def receive destination_name, receiver=nil, subscribe_headers={}, timeout=10
317
321
  raise "You cannot have a nil or empty destination name." if destination_name.nil?
318
322
  conn = nil
319
323
  dest = find_destination destination_name
320
324
  config = load_connection_configuration(dest.broker_name)
321
- subscribe_headers['id'] = receiver.name.underscore unless (receiver.nil? or subscribe_headers.key? 'id')
325
+ subscribe_headers['id'] = receiver.name.underscore unless (receiver.nil? or subscribe_headers.key? 'id')
322
326
  Timeout.timeout timeout do
323
327
  conn = Gateway.adapters[config[:adapter]].new(config)
324
328
  conn.subscribe(dest.value, subscribe_headers)
@@ -332,7 +336,7 @@ module ActiveMessaging
332
336
  ensure
333
337
  conn.disconnect unless conn.nil?
334
338
  end
335
-
339
+
336
340
  def processor_group group_name, *processors
337
341
  if processor_groups.has_key? group_name
338
342
  processor_groups[group_name] = processor_groups[group_name] + processors
@@ -362,7 +366,7 @@ module ActiveMessaging
362
366
  end
363
367
  @current_processor_group
364
368
  end
365
-
369
+
366
370
  def load_connection_configuration(label='default')
367
371
  @broker_yml = YAML::load(ERB.new(IO.read(File.join(ActiveMessaging.app_root, 'config', 'broker.yml'))).result) if @broker_yml.nil?
368
372
  if label == 'default'
@@ -374,14 +378,14 @@ module ActiveMessaging
374
378
  config[:adapter] ||= :stomp
375
379
  return config
376
380
  end
377
-
381
+
378
382
  end
379
383
 
380
384
  end
381
385
 
382
386
  class Subscription
383
387
  attr_accessor :destination, :processor_class, :subscribe_headers
384
-
388
+
385
389
  def initialize(destination, processor_class, subscribe_headers = {})
386
390
  @destination, @processor_class, @subscribe_headers = destination, processor_class, subscribe_headers
387
391
  subscribe_headers['id'] = processor_class.name.underscore unless subscribe_headers.key? 'id'
@@ -389,7 +393,7 @@ module ActiveMessaging
389
393
 
390
394
  def subscribe
391
395
  ActiveMessaging.logger.error "=> Subscribing to #{destination.value} (processed by #{processor_class})"
392
- Gateway.connection(@destination.broker_name).subscribe(@destination.value, subscribe_headers)
396
+ Gateway.connection(@destination.broker_name).subscribe(@destination.value, subscribe_headers)
393
397
  end
394
398
 
395
399
  def unsubscribe
@@ -408,13 +412,13 @@ module ActiveMessaging
408
412
  @publish_headers.reverse_merge! DEFAULT_PUBLISH_HEADERS
409
413
  @wildcard = wildcard_match_exp_for(value) if (value =~ /\*/)
410
414
  end
411
-
415
+
412
416
  def to_s
413
417
  "<destination: #{broker_name} :#{name}=>'#{value}'>"
414
418
  end
415
-
419
+
416
420
  private
417
-
421
+
418
422
  def wildcard_match_exp_for(destination)
419
423
  exp = destination.to_s.gsub(/[.]/, '\.').gsub(/[*]/, '[^.*]+').gsub(/([>].*$)/, '.*') + '$'
420
424
  Regexp.new(exp)
@@ -17,6 +17,10 @@ module ActiveMessaging
17
17
  end
18
18
 
19
19
  end
20
+
21
+ rake_tasks do
22
+ load "tasks/start_consumers.rake"
23
+ end
20
24
 
21
25
  end
22
26
  end
@@ -1,6 +1,3 @@
1
- # still working on prioritized worker requests
2
-
3
-
4
1
  # This owes no small debt to sidekiq for showing how to use celluloid for polling for messages.
5
2
  # https://github.com/mperham/sidekiq/blob/poller/lib/sidekiq/manager.rb
6
3
  if RUBY_VERSION.to_f >= 1.9 # Celluloid requires fibers support, which is not available on 1.8
@@ -15,7 +12,7 @@ module ActiveMessaging
15
12
  # traps when any worker dies
16
13
  trap_exit :died
17
14
 
18
- attr_accessor :configuration, :receiver, :connection, :workers, :busy, :running
15
+ attr_accessor :configuration, :receiver, :connection, :workers, :busy, :running, :pause
19
16
 
20
17
  #
21
18
  # connection is a string, name of the connection from broker.yml to use for this threaded poller instance
@@ -34,6 +31,7 @@ module ActiveMessaging
34
31
  # default config is a pool size of 3 worker threads
35
32
  self.configuration = configuration || [{:pool_size => 3}]
36
33
  self.connection = connection
34
+ self.pause = 1
37
35
  end
38
36
 
39
37
  def start
@@ -54,7 +52,7 @@ module ActiveMessaging
54
52
 
55
53
  # create a message receiver actor, ony need one, using connection
56
54
  receiver_connection = ActiveMessaging::Gateway.connection(connection)
57
- self.receiver = MessageReceiver.new(current_actor, receiver_connection)
55
+ self.receiver = MessageReceiver.new(current_actor, receiver_connection, pause)
58
56
 
59
57
  # start the workers based on the config
60
58
  configuration.each do |c|
@@ -138,6 +136,14 @@ module ActiveMessaging
138
136
  (!running && busy.empty?)
139
137
  end
140
138
 
139
+ def inspect
140
+ "#<ThreadedPoller #{to_s}>"
141
+ end
142
+
143
+ def to_s
144
+ @str ||= "#{Process.pid}-#{Thread.current.object_id}:#{self.object_id}"
145
+ end
146
+
141
147
  def logger; ActiveMessaging.logger; end
142
148
 
143
149
  end
@@ -172,12 +178,20 @@ module ActiveMessaging
172
178
  logger.debug("ActiveMessaging::MessageReceiver.receive: terminate")
173
179
  self.terminate
174
180
  end
175
- logger.debug("ActiveMessaging::MessageReceiver.receive: no message, retry in #{pause} sec")
181
+ logger.debug("ActiveMessaging::MessageReceiver.receive: no message for worker #{worker.object_id}, retry in #{pause} sec")
176
182
  after(pause) { receive(worker) }
177
183
  end
178
184
 
179
185
  end
180
186
 
187
+ def inspect
188
+ "#<MessageReceiver #{to_s}>"
189
+ end
190
+
191
+ def to_s
192
+ @str ||= "#{Process.pid}-#{Thread.current.object_id}:#{self.object_id}"
193
+ end
194
+
181
195
  def logger; ::ActiveMessaging.logger; end
182
196
  end
183
197
 
@@ -194,6 +208,9 @@ module ActiveMessaging
194
208
  def execute(message)
195
209
  begin
196
210
  ::ActiveMessaging::Gateway.dispatch(message)
211
+ rescue Object => err
212
+ logger.error("ActiveMessaging::Worker.execute error - #{err.inspect}")
213
+ abort(err)
197
214
  ensure
198
215
  ::ActiveRecord::Base.clear_active_connections! if defined?(::ActiveRecord)
199
216
  end
@@ -201,6 +218,14 @@ module ActiveMessaging
201
218
  poller.executed!(current_actor)
202
219
  end
203
220
 
221
+ def inspect
222
+ "#<Worker #{to_s}>"
223
+ end
224
+
225
+ def to_s
226
+ @str ||= "#{Process.pid}-#{Thread.current.object_id}:#{self.object_id}"
227
+ end
228
+
204
229
  def logger; ::ActiveMessaging.logger; end
205
230
 
206
231
  end
@@ -3,11 +3,11 @@ module ActiveMessaging
3
3
  source_root File.expand_path("../templates", __FILE__)
4
4
 
5
5
  argument :poller_name, :type => :string, :default => 'poller', :banner => 'poller_name'
6
-
6
+
7
7
  def copy_application
8
8
  copy_file "application_processor.rb", "app/processors/application_processor.rb"
9
9
  end
10
-
10
+
11
11
  def copy_poller
12
12
  template "poller", "script/#{poller_name}"
13
13
  chmod("script/#{poller_name}", 0755)
@@ -25,15 +25,15 @@ module ActiveMessaging
25
25
  def copy_broker_rb
26
26
  copy_file "broker.yml", "config/broker.yml"
27
27
  end
28
-
28
+
29
29
  def add_gems
30
30
  gem("daemons")
31
31
  end
32
-
33
-
32
+
33
+
34
34
  def change_application
35
35
  application ' config.autoload_paths += %W(#{config.root}/app/processors)'
36
36
  end
37
37
 
38
38
  end
39
- end
39
+ end
@@ -26,6 +26,7 @@ Dir["#{lib_path}/**/*.rb"].each {|file| require file unless file.match(/poller\.
26
26
  # require and load activemessaging
27
27
  require 'activemessaging'
28
28
  ActiveMessaging.load_activemessaging
29
+ require 'activemessaging/threaded_poller'
29
30
 
30
31
  # configure the connection (there can be multiple defined in broker.yml) and number of threads
31
32
  connection_name = 'default'
@@ -4,7 +4,7 @@ module ActiveMessaging
4
4
  source_root File.expand_path("../templates", __FILE__)
5
5
 
6
6
  # check_class_collision :suffix=>"Processor"
7
-
7
+
8
8
  def copy_processor
9
9
  template "processor.rb", "app/processors/#{file_name}_processor.rb"
10
10
  end
@@ -36,4 +36,4 @@ module Rspec
36
36
  template "processor_spec.rb", "spec/functional/#{file_name}_processor_spec.rb"
37
37
  end
38
38
  end
39
- end
39
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activemessaging
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
5
- prerelease:
4
+ version: 0.12.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jon Tirsen
@@ -16,86 +15,90 @@ authors:
16
15
  autorequire:
17
16
  bindir: bin
18
17
  cert_chain: []
19
- date: 2012-09-28 00:00:00.000000000 Z
18
+ date: 2014-06-05 00:00:00.000000000 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: activemessaging
23
22
  requirement: !ruby/object:Gem::Requirement
24
- none: false
25
23
  requirements:
26
- - - ! '>='
24
+ - - '>='
27
25
  - !ruby/object:Gem::Version
28
26
  version: '0'
29
27
  type: :runtime
30
28
  prerelease: false
31
29
  version_requirements: !ruby/object:Gem::Requirement
32
- none: false
33
30
  requirements:
34
- - - ! '>='
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ - !ruby/object:Gem::Dependency
35
+ name: jeweler
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ type: :development
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
35
46
  - !ruby/object:Gem::Version
36
47
  version: '0'
37
48
  - !ruby/object:Gem::Dependency
38
49
  name: activesupport
39
50
  requirement: !ruby/object:Gem::Requirement
40
- none: false
41
51
  requirements:
42
- - - ! '>='
52
+ - - '>='
43
53
  - !ruby/object:Gem::Version
44
54
  version: 2.3.11
45
55
  type: :runtime
46
56
  prerelease: false
47
57
  version_requirements: !ruby/object:Gem::Requirement
48
- none: false
49
58
  requirements:
50
- - - ! '>='
59
+ - - '>='
51
60
  - !ruby/object:Gem::Version
52
61
  version: 2.3.11
53
62
  - !ruby/object:Gem::Dependency
54
63
  name: jeweler
55
64
  requirement: !ruby/object:Gem::Requirement
56
- none: false
57
65
  requirements:
58
- - - ! '>='
66
+ - - '>='
59
67
  - !ruby/object:Gem::Version
60
68
  version: '0'
61
69
  type: :development
62
70
  prerelease: false
63
71
  version_requirements: !ruby/object:Gem::Requirement
64
- none: false
65
72
  requirements:
66
- - - ! '>='
73
+ - - '>='
67
74
  - !ruby/object:Gem::Version
68
75
  version: '0'
69
76
  - !ruby/object:Gem::Dependency
70
77
  name: stomp
71
78
  requirement: !ruby/object:Gem::Requirement
72
- none: false
73
79
  requirements:
74
- - - ! '>='
80
+ - - '>='
75
81
  - !ruby/object:Gem::Version
76
82
  version: '0'
77
83
  type: :development
78
84
  prerelease: false
79
85
  version_requirements: !ruby/object:Gem::Requirement
80
- none: false
81
86
  requirements:
82
- - - ! '>='
87
+ - - '>='
83
88
  - !ruby/object:Gem::Version
84
89
  version: '0'
85
90
  - !ruby/object:Gem::Dependency
86
91
  name: appraisal
87
92
  requirement: !ruby/object:Gem::Requirement
88
- none: false
89
93
  requirements:
90
- - - ! '>='
94
+ - - '>='
91
95
  - !ruby/object:Gem::Version
92
96
  version: '0'
93
97
  type: :development
94
98
  prerelease: false
95
99
  version_requirements: !ruby/object:Gem::Requirement
96
- none: false
97
100
  requirements:
98
- - - ! '>='
101
+ - - '>='
99
102
  - !ruby/object:Gem::Version
100
103
  version: '0'
101
104
  description: ActiveMessaging is an attempt to bring the simplicity and elegance of
@@ -201,30 +204,26 @@ files:
201
204
  - test/tracer_test.rb
202
205
  homepage: http://github.com/kookster/activemessaging
203
206
  licenses: []
207
+ metadata: {}
204
208
  post_install_message:
205
209
  rdoc_options: []
206
210
  require_paths:
207
211
  - lib
208
212
  required_ruby_version: !ruby/object:Gem::Requirement
209
- none: false
210
213
  requirements:
211
- - - ! '>='
214
+ - - '>='
212
215
  - !ruby/object:Gem::Version
213
216
  version: '0'
214
- segments:
215
- - 0
216
- hash: 2900052431742468498
217
217
  required_rubygems_version: !ruby/object:Gem::Requirement
218
- none: false
219
218
  requirements:
220
- - - ! '>='
219
+ - - '>='
221
220
  - !ruby/object:Gem::Version
222
221
  version: '0'
223
222
  requirements: []
224
223
  rubyforge_project:
225
- rubygems_version: 1.8.22
224
+ rubygems_version: 2.1.11
226
225
  signing_key:
227
- specification_version: 3
226
+ specification_version: 4
228
227
  summary: Official activemessaging gem, now hosted on github.com/kookster. (kookster
229
228
  prefix temporary)
230
229
  test_files: []