activemessaging 0.12.1 → 0.12.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []