qwirk 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/README.md +9 -14
  2. data/lib/qwirk.rb +26 -17
  3. data/lib/qwirk/adapter.rb +3 -45
  4. data/lib/qwirk/adapter/base.rb +2 -0
  5. data/lib/qwirk/adapter/base/expanding_worker_config.rb +133 -0
  6. data/lib/qwirk/adapter/base/worker_config.rb +104 -0
  7. data/lib/qwirk/adapter/in_memory.rb +13 -0
  8. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/factory.rb +2 -2
  9. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/publisher.rb +4 -4
  10. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/queue.rb +3 -2
  11. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/reply_queue.rb +3 -2
  12. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/topic.rb +2 -2
  13. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/worker.rb +6 -8
  14. data/lib/qwirk/adapter/in_memory/worker_config.rb +50 -0
  15. data/lib/qwirk/adapter/inline.rb +9 -0
  16. data/lib/qwirk/adapter/inline/publisher.rb +86 -0
  17. data/lib/qwirk/adapter/inline/worker.rb +55 -0
  18. data/lib/qwirk/adapter/inline/worker_config.rb +30 -0
  19. data/lib/qwirk/adapter_factory.rb +48 -0
  20. data/lib/qwirk/base_worker.rb +18 -28
  21. data/lib/qwirk/batch/file_worker.rb +4 -4
  22. data/lib/qwirk/manager.rb +11 -8
  23. data/lib/qwirk/marshal_strategy/none.rb +1 -1
  24. data/lib/qwirk/publish_handle.rb +22 -11
  25. data/lib/qwirk/publisher.rb +9 -9
  26. data/lib/qwirk/{request_worker.rb → reply_worker.rb} +3 -3
  27. data/lib/qwirk/worker.rb +27 -29
  28. data/test/jms_fail_test.rb +11 -11
  29. data/test/jms_requestor_block_test.rb +12 -12
  30. data/test/jms_requestor_test.rb +8 -8
  31. data/test/jms_test.rb +10 -10
  32. metadata +104 -185
  33. data/examples/README +0 -1
  34. data/examples/activemq.xml +0 -84
  35. data/examples/advanced_requestor/README.md +0 -15
  36. data/examples/advanced_requestor/base_request_worker.rb +0 -18
  37. data/examples/advanced_requestor/char_count_worker.rb +0 -16
  38. data/examples/advanced_requestor/config.ru +0 -24
  39. data/examples/advanced_requestor/exception_raiser_worker.rb +0 -17
  40. data/examples/advanced_requestor/length_worker.rb +0 -14
  41. data/examples/advanced_requestor/print_worker.rb +0 -14
  42. data/examples/advanced_requestor/publisher.rb +0 -49
  43. data/examples/advanced_requestor/qwirk.yml +0 -16
  44. data/examples/advanced_requestor/reverse_worker.rb +0 -14
  45. data/examples/advanced_requestor/triple_worker.rb +0 -14
  46. data/examples/batch/my_batch_worker.rb +0 -30
  47. data/examples/batch/my_line_worker.rb +0 -8
  48. data/examples/qwirk.yml +0 -20
  49. data/examples/requestor/README.md +0 -13
  50. data/examples/requestor/config.ru +0 -13
  51. data/examples/requestor/qwirk_persist.yml +0 -5
  52. data/examples/requestor/requestor.rb +0 -68
  53. data/examples/requestor/reverse_echo_worker.rb +0 -15
  54. data/examples/setup.rb +0 -13
  55. data/examples/shared/README.md +0 -24
  56. data/examples/shared/config.ru +0 -13
  57. data/examples/shared/publisher.rb +0 -49
  58. data/examples/shared/qwirk_persist.yml +0 -5
  59. data/examples/shared/shared_worker.rb +0 -16
  60. data/examples/simple/README +0 -53
  61. data/examples/simple/bar_worker.rb +0 -10
  62. data/examples/simple/baz_worker.rb +0 -10
  63. data/examples/simple/config.ru +0 -14
  64. data/examples/simple/publisher.rb +0 -49
  65. data/examples/simple/qwirk_persist.yml +0 -4
  66. data/examples/simple/tmp/kahadb/db-1.log +0 -0
  67. data/examples/simple/tmp/kahadb/db.data +0 -0
  68. data/examples/simple/tmp/kahadb/db.redo +0 -0
  69. data/examples/task/README +0 -47
  70. data/examples/task/config.ru +0 -14
  71. data/examples/task/foo_worker.rb +0 -10
  72. data/examples/task/messages.out +0 -1000
  73. data/examples/task/publisher.rb +0 -25
  74. data/examples/task/qwirk_persist.yml +0 -5
  75. data/examples/task/task.rb +0 -36
  76. data/lib/qwirk/queue_adapter.rb +0 -3
  77. data/lib/qwirk/queue_adapter/active_mq.rb +0 -13
  78. data/lib/qwirk/queue_adapter/active_mq/publisher.rb +0 -12
  79. data/lib/qwirk/queue_adapter/active_mq/worker_config.rb +0 -16
  80. data/lib/qwirk/queue_adapter/in_mem.rb +0 -7
  81. data/lib/qwirk/queue_adapter/in_mem/worker_config.rb +0 -59
  82. data/lib/qwirk/queue_adapter/jms.rb +0 -50
  83. data/lib/qwirk/queue_adapter/jms/connection.rb +0 -42
  84. data/lib/qwirk/queue_adapter/jms/consumer.rb +0 -37
  85. data/lib/qwirk/queue_adapter/jms/publisher.rb +0 -126
  86. data/lib/qwirk/queue_adapter/jms/worker.rb +0 -89
  87. data/lib/qwirk/queue_adapter/jms/worker_config.rb +0 -38
  88. data/lib/qwirk/version.rb +0 -3
  89. data/lib/qwirk/worker_config.rb +0 -187
@@ -1,7 +1,7 @@
1
1
  module Qwirk
2
2
  module Batch
3
3
 
4
- # Batch worker which reads records from files and queues them up for a separate worker (Qwirk::QueueAdapter::JMS::RequestWorker) to process.
4
+ # Batch worker which reads records from files and queues them up for a separate worker (Qwirk::Adapter::JMS::ReplyWorker) to process.
5
5
  # For instance, a worker of this type might look as follows:
6
6
  # class MyBatchWorker
7
7
  # include Qwirk::Batch::FileWorker
@@ -204,18 +204,18 @@ module Qwirk
204
204
  #######
205
205
 
206
206
  def reply_event_loop
207
- @reply_session = Qwirk::QueueAdapter::JMS::Connection.create_session
207
+ @reply_session = Qwirk::Adapter::JMS::Connection.create_session
208
208
  @consumer = @reply_session.consumer(:queue_name => @queue_name)
209
209
  @reply_session.start
210
210
 
211
211
  while !@stopped && message = @consumer.receive
212
212
  @message_mutex.synchronize do
213
- obj = Qwirk::QueueAdapter::JMS.parse_response(message)
213
+ obj = Qwirk::Adapter::JMS.parse_response(message)
214
214
  process_response(obj)
215
215
  message.acknowledge
216
216
  end
217
217
  # TODO: @time_track now in WorkerConfig
218
- #Qwirk.logger.info {"#{self}::on_message (#{('%.1f' % (@time_track.last_time*1000.0))}ms)"} if Qwirk::QueueAdapter::JMS::Connection.log_times?
218
+ #Qwirk.logger.info {"#{self}::on_message (#{('%.1f' % (@time_track.last_time*1000.0))}ms)"} if Qwirk::Adapter::JMS::Connection.log_times?
219
219
  end
220
220
  @status = 'Exited'
221
221
  Qwirk.logger.info "#{self}: Exiting"
data/lib/qwirk/manager.rb CHANGED
@@ -25,9 +25,9 @@ module Qwirk
25
25
  # production, a set of workers could be defined under production or specific workers for each host name.
26
26
  # persist_file - WorkerConfig attributes that are modified externally (via Rumx interface) will be stored in this file. Without this
27
27
  # option, external config changes that are made will be lost when the Manager is restarted.
28
- def initialize(queue_adapter, options={})
28
+ def initialize(adapter_factory, options={})
29
+ @adapter_factory = adapter_factory
29
30
  options = @@default_options.merge(options)
30
- #puts "creating qwirk manager with #{options.inspect}"
31
31
  @stopped = false
32
32
  @name = options[:name] || Qwirk::DEFAULT_NAME
33
33
  @poll_time = 3.0
@@ -38,13 +38,13 @@ module Qwirk
38
38
  @persist_options = (@persist_file && File.exist?(@persist_file)) ? YAML.load_file(@persist_file) : {}
39
39
 
40
40
  BaseWorker.worker_classes.each do |worker_class|
41
- worker_config_class = worker_class.config_class
42
- worker_class.each_config do |config_name, default_options|
43
- # Least priority is config options defined in the Worker class, then the workers.yml file, highest priority is persist_file (ad-hoc changes made manually)
41
+ worker_class.each_config(adapter_factory.worker_config_class) do |config_name, extended_worker_config_class, default_options|
42
+ # Least priority is config default_options defined in the Worker class, then the workers.yml file,
43
+ # highest priority is persist_file (ad-hoc changes made manually)
44
44
  options = {}
45
45
  options = options.merge(@worker_options[config_name]) if @worker_options[config_name]
46
46
  options = options.merge(@persist_options[config_name]) if @persist_options[config_name]
47
- worker_config = worker_config_class.new(queue_adapter, config_name, self, worker_class, default_options, options)
47
+ worker_config = extended_worker_config_class.new(adapter_factory, config_name, self, worker_class, default_options, options)
48
48
  bean_add_child(config_name, worker_config)
49
49
  @worker_configs << worker_config
50
50
  end
@@ -54,6 +54,8 @@ module Qwirk
54
54
  stop_on_signal if options[:stop_on_signal]
55
55
  end
56
56
 
57
+ # Create a timer_thread to make periodic calls to the worker_configs in order to do such things as expand/contract
58
+ # workers, etc.
57
59
  def start_timer_thread
58
60
  # TODO: Optionize hard-coded values
59
61
  @timer_thread = Thread.new do
@@ -86,12 +88,13 @@ module Qwirk
86
88
  end
87
89
  end
88
90
 
91
+ # Store off any options that are no longer set to default
89
92
  def save_persist_state
90
93
  return unless @persist_file
91
94
  new_persist_options = {}
92
95
  BaseWorker.worker_classes.each do |worker_class|
93
- worker_class.each_config do |config_name, options|
94
- static_options = options.merge(@worker_options[config_name] || {})
96
+ worker_class.each_config(@adapter_factory.worker_config_class) do |config_name, ignored_extended_worker_config_class, default_options|
97
+ static_options = default_options.merge(@worker_options[config_name] || {})
95
98
  worker_config = self[config_name]
96
99
  hash = {}
97
100
  # Only store off the config values that are specifically different from default values or values set in the workers.yml file
@@ -1,6 +1,6 @@
1
1
  module Qwirk
2
2
  module MarshalStrategy
3
- # Should only be used with InMem strategy
3
+ # Should only be used with InMemory strategy
4
4
  module None
5
5
  extend self
6
6
 
@@ -3,9 +3,14 @@ require 'timeout'
3
3
  module Qwirk
4
4
  class PublishHandle
5
5
  def initialize(publisher, adapter_info, start)
6
- @producer = publisher
6
+ @producer = publisher
7
7
  @adapter_info = adapter_info
8
8
  @start = start
9
+ @timeout = false
10
+ end
11
+
12
+ def timeout?
13
+ @timeout
9
14
  end
10
15
 
11
16
  # Waits the given timeout for a response message on the queue.
@@ -54,13 +59,19 @@ module Qwirk
54
59
  # Creates a block for reading the responses for a given message_id (adapter_info). The block will be passed an object
55
60
  # that responds to timeout_read(timeout) with a [original_message_id, response_message, worker_name] tri or nil if no message is read.
56
61
  # This is used in the RPC mechanism where a publish might wait for 1 or more workers to respond.
57
- @producer.adapter.with_response(@adapter_info) do |consumer|
62
+ @producer.impl.with_response(@adapter_info) do |consumer|
58
63
  if block_given?
59
64
  return read_multiple_response(consumer, timeout, &block)
60
65
  else
61
- response = read_single_response(consumer, timeout)
62
- raise response if response.kind_of?(Qwirk::RemoteException)
63
- return response
66
+ tri = read_single_response(consumer, timeout)
67
+ if tri
68
+ response = tri[1]
69
+ raise response if response.kind_of?(Qwirk::RemoteException)
70
+ return response
71
+ else
72
+ @timeout = !tri
73
+ return nil
74
+ end
64
75
  end
65
76
  end
66
77
  end
@@ -71,8 +82,7 @@ module Qwirk
71
82
 
72
83
  def read_single_response(consumer, timeout)
73
84
  leftover_timeout = @start + timeout - Time.now
74
- message_id, response, @worker_name = consumer.timeout_read(leftover_timeout)
75
- return response
85
+ return consumer.timeout_read(leftover_timeout)
76
86
  end
77
87
 
78
88
  def read_multiple_response(consumer, timeout, &block)
@@ -80,15 +90,16 @@ module Qwirk
80
90
  yield worker_response
81
91
 
82
92
  until worker_response.done? do
83
- response = read_single_response(consumer, timeout)
84
- if !response
93
+ tri = read_single_response(consumer, timeout)
94
+ if !tri
85
95
  worker_response.make_timeout_calls
86
96
  return
87
97
  end
98
+ ignored_message_id, response, worker_name = tri
88
99
  if response.kind_of?(Qwirk::RemoteException)
89
- worker_response.make_exception_call(@worker_name, response)
100
+ worker_response.make_exception_call(worker_name, response)
90
101
  else
91
- worker_response.make_message_call(@worker_name, response)
102
+ worker_response.make_message_call(worker_name, response)
92
103
  end
93
104
  end
94
105
  end
@@ -4,7 +4,7 @@ module Qwirk
4
4
  include Rumx::Bean
5
5
 
6
6
  #attr_reader :producer_options, :persistent, :reply_queue
7
- attr_reader :response_options, :adapter, :marshaler
7
+ attr_reader :response_options, :impl, :marshaler
8
8
 
9
9
  bean_attr_reader :tasks, :hash, 'Hash of the latest tasks', :hash_type => :bean
10
10
 
@@ -19,7 +19,7 @@ module Qwirk
19
19
  # :response => if true or a hash of response options, a temporary reply queue will be setup for handling responses
20
20
  # :time_to_live => expiration time in ms for the response message(s) (JMS))
21
21
  # :persistent => true or false for the response message(s), set to false if you don't want timed out messages ending up in the DLQ (defaults to true unless time_to_live is set)
22
- def initialize(queue_adapter, options)
22
+ def initialize(adapter_factory, options)
23
23
  options = options.dup
24
24
  @queue_name = options.delete(:queue_name)
25
25
  @topic_name = options.delete(:topic_name)
@@ -29,17 +29,17 @@ module Qwirk
29
29
  # response_options should only be a hash or the values true or false
30
30
  @response_options = {} if @response_options && !@response_options.kind_of?(Hash)
31
31
 
32
- @tasks = {}
33
- @adapter = queue_adapter.create_adapter_publisher(@queue_name, @topic_name, options, @response_options)
34
- marshal_sym = options[:marshal] || :ruby
35
- @marshaler = Qwirk::MarshalStrategy.find(marshal_sym)
32
+ @tasks = {}
33
+ @impl = adapter_factory.create_publisher_impl(@queue_name, @topic_name, options, @response_options)
34
+ marshal_sym = options[:marshal] || :ruby
35
+ @marshaler = Qwirk::MarshalStrategy.find(marshal_sym)
36
36
  end
37
37
 
38
38
  # Publish the given object to the address.
39
39
  def publish(object, props={})
40
40
  start = Time.now
41
41
  marshaled_object = @marshaler.marshal(object)
42
- adapter_info = @adapter.publish(marshaled_object, @marshaler, nil, props)
42
+ adapter_info = @impl.publish(marshaled_object, @marshaler, nil, props)
43
43
  return PublishHandle.new(self, adapter_info, start)
44
44
  end
45
45
 
@@ -49,7 +49,7 @@ module Qwirk
49
49
  # last message read. It should also respond to stop which will interrupt any receive calls causing it to return nil.
50
50
  def create_producer_consumer_pair(task)
51
51
  @tasks[task.task_id] = task
52
- @adapter.create_producer_consumer_pair(task.task_id, @marshaler)
52
+ @impl.create_producer_consumer_pair(task.task_id, @marshaler)
53
53
  end
54
54
 
55
55
  def to_s
@@ -61,7 +61,7 @@ module Qwirk
61
61
  end
62
62
 
63
63
  def create_fail_queue_consumer(fail_queue_name=nil)
64
- fail_queue_name ||= default_fail_queue_name
64
+ fail_queue_name || default_fail_queue_name
65
65
  end
66
66
  end
67
67
  end
@@ -1,7 +1,7 @@
1
1
  module Qwirk
2
2
 
3
3
  # Base Worker Class for any class that will be processing requests from queues and replying
4
- module RequestWorker
4
+ module ReplyWorker
5
5
  include Worker
6
6
 
7
7
  module ClassMethods
@@ -27,7 +27,7 @@ module Qwirk
27
27
  rescue Exception => e
28
28
  on_exception(e)
29
29
  else
30
- adapter.send_response(message, config.marshaler.marshal(response))
30
+ impl.send_response(message, config.marshaler.marshal(response))
31
31
  end
32
32
  post_request(object)
33
33
  rescue Exception => e
@@ -49,7 +49,7 @@ module Qwirk
49
49
 
50
50
  def on_exception(e)
51
51
  begin
52
- adapter.send_exception(message, e)
52
+ impl.send_exception(message, e)
53
53
  rescue Exception => e
54
54
  Qwirk.logger.error("Exception in exception reply: #{e.message}")
55
55
  log_backtrace(e)
data/lib/qwirk/worker.rb CHANGED
@@ -4,7 +4,7 @@ module Qwirk
4
4
  # By default, it will consume messages from a queue with the class name minus the Worker postfix.
5
5
  # For example, the queue call is unnecessary as it will default to a value of 'Foo' anyways:
6
6
  # class FooWorker
7
- # include Qwirk::QueueAdapter::JMS::Worker
7
+ # include Qwirk::Worker
8
8
  # queue 'Foo'
9
9
  # def perform(obj)
10
10
  # # Perform work on obj
@@ -15,7 +15,7 @@ module Qwirk
15
15
  # each thread for a given worker will act as a separate subscriber.
16
16
  # (For ActiveMQ - see http://activemq.apache.org/virtual-destinations.html):
17
17
  # class FooWorker
18
- # include Qwirk::QueueAdapter::JMS::Worker
18
+ # include Qwirk::Worker
19
19
  # topic 'Zulu'
20
20
  # def perform(obj)
21
21
  # # Perform work on obj
@@ -25,7 +25,7 @@ module Qwirk
25
25
  # TODO (maybe):
26
26
  # Filters can also be specified within the class:
27
27
  # class FooWorker
28
- # include Qwirk::QueueAdapter::JMS::Worker
28
+ # include Qwirk::Worker
29
29
  # filter 'age > 30'
30
30
  # def perform(obj)
31
31
  # # Perform work on obj
@@ -37,7 +37,7 @@ module Qwirk
37
37
  include Qwirk::BaseWorker
38
38
 
39
39
  attr_accessor :message
40
- attr_reader :status, :adapter, :start_worker_time, :start_read_time, :start_processing_time
40
+ attr_reader :status, :impl, :start_worker_time, :start_read_time, :start_processing_time
41
41
 
42
42
  module ClassMethods
43
43
  def queue(name, opts={})
@@ -71,13 +71,12 @@ module Qwirk
71
71
  end
72
72
 
73
73
  # Defines the default value of the fail_queue_target. For extenders of this class, the default will be true
74
- # but extenders can change this (RequestWorker returns exceptions to the caller so it defaults to false).
74
+ # but extenders can change this (ReplyWorker returns exceptions to the caller so it defaults to false).
75
75
  def default_fail_queue_target
76
76
  true
77
77
  end
78
78
 
79
79
  def queue_name(default_name)
80
- puts "getting queue_name queue=#{@queue_name} topic=#{@topic_name} default=#{default_name}"
81
80
  return @queue_name if @queue_name
82
81
  return nil if @topic_name
83
82
  return default_name
@@ -113,13 +112,16 @@ module Qwirk
113
112
  base.extend(ClassMethods)
114
113
  end
115
114
 
116
- def start(index, worker_config)
117
- @status = 'Started'
118
- @stopped = false
119
- @processing_mutex = Mutex.new
120
- self.index = index
121
- self.config = worker_config
122
- @adapter = worker_config.adapter.create_worker
115
+ def init(index, worker_config)
116
+ @status = 'Started'
117
+ @stopped = false
118
+ @processing_mutex = Mutex.new
119
+ self.index = index
120
+ self.config = worker_config
121
+ @impl = worker_config.create_worker
122
+ end
123
+
124
+ def start
123
125
  self.thread = Thread.new do
124
126
  java.lang.Thread.current_thread.name = "Qwirk worker: #{self}" if RUBY_PLATFORM == 'jruby'
125
127
  #Qwirk.logger.debug "#{worker}: Started thread with priority #{Thread.current.priority}"
@@ -131,17 +133,17 @@ module Qwirk
131
133
  # clean up any resources. We don't want to clobber resources while a message is being processed so processing_mutex will surround
132
134
  # message processessing and worker closing.
133
135
  # From a JMS perspective, stop all workers (close consumer and session), stop the config.
134
- # From an InMem perspective, we don't want the workers stopping until all messages in the queue have been processed.
136
+ # From an InMemory perspective, we don't want the workers stopping until all messages in the queue have been processed.
135
137
  # Therefore we want to stop the
136
138
  def stop
137
- puts "#{self}: In base worker stop"
139
+ Qwirk.logger.debug "#{self}: In base worker stop"
138
140
  @status = 'Stopping'
139
141
  @stopped = true
140
142
  @processing_mutex.synchronize do
141
- # This should interrupt @adapter.receive_message above and cause it to return nil
142
- @adapter.stop
143
+ # This should interrupt @impl.receive_message above and cause it to return nil
144
+ @impl.stop
143
145
  end
144
- puts "#{self}: base worker stop complete"
146
+ Qwirk.logger.debug "#{self}: base worker stop complete"
145
147
  end
146
148
 
147
149
  def perform(object)
@@ -157,25 +159,21 @@ module Qwirk
157
159
  Qwirk.logger.error "\t#{e.backtrace.join("\n\t")}"
158
160
  end
159
161
 
160
- #########
161
- protected
162
- #########
163
-
164
162
  # Start the event loop for handling messages off the queue
165
163
  def event_loop
166
164
  Qwirk.logger.debug "#{self}: Starting receive loop"
167
165
  @start_worker_time = Time.now
168
- while !@stopped && !config.adapter.stopped
169
- puts "#{self}: Waiting for read"
166
+ while !@stopped && !config.stopped
167
+ Qwirk.logger.debug "#{self}: Waiting for read"
170
168
  @start_read_time = Time.now
171
- msg = @adapter.receive_message
169
+ msg = @impl.receive_message
172
170
  if msg
173
171
  @start_processing_time = Time.now
174
172
  Qwirk.logger.debug {"#{self}: Done waiting for read in #{@start_processing_time - @start_read_time} seconds"}
175
173
  delta = config.timer.measure do
176
174
  @processing_mutex.synchronize do
177
175
  on_message(msg)
178
- @adapter.acknowledge_message(msg)
176
+ @impl.acknowledge_message(msg)
179
177
  end
180
178
  end
181
179
  Qwirk.logger.info {"#{self}::on_message (#{'%.1f' % delta}ms)"} if self.config.log_times
@@ -189,7 +187,7 @@ module Qwirk
189
187
  ensure
190
188
  @status = 'Stopped'
191
189
  # TODO: necessary?
192
- @adapter.stop
190
+ @impl.stop
193
191
  Qwirk.logger.flush if Qwirk.logger.respond_to?(:flush)
194
192
  config.worker_stopped(self)
195
193
  end
@@ -197,7 +195,7 @@ module Qwirk
197
195
  def on_message(message)
198
196
  # TBD - Is it necessary to provide underlying message to worker? Should we generically provide access to message attributes? Do filters somehow fit in here?
199
197
  @message = message
200
- object = @adapter.message_to_object(message)
198
+ object = @impl.message_to_object(message)
201
199
  Qwirk.logger.debug {"#{self}: Received Object: #{object}"}
202
200
  perform(object)
203
201
  rescue Exception => e
@@ -209,7 +207,7 @@ module Qwirk
209
207
  def on_exception(e)
210
208
  Qwirk.logger.error "#{self}: Messaging Exception: #{e.message}"
211
209
  log_backtrace(e)
212
- @adapter.handle_failure(message, @fail_queue_name) if @fail_queue_name
210
+ @impl.handle_failure(message, e, @fail_queue_name) if @fail_queue_name
213
211
  rescue Exception => e
214
212
  Qwirk.logger.error "#{self}: Exception in exception reply: #{e.message}"
215
213
  log_backtrace(e)
@@ -7,7 +7,7 @@ require 'erb'
7
7
  # NOTE: This test requires a running ActiveMQ server
8
8
 
9
9
  class ExceptionWorker
10
- include Qwirk::QueueAdapter::JMS::Worker
10
+ include Qwirk::Adapter::JMS::Worker
11
11
  def perform(obj)
12
12
  puts "#{name} received #{obj} but raising exception"
13
13
  raise 'foobar'
@@ -17,8 +17,8 @@ class ExceptionWorker
17
17
  end
18
18
  end
19
19
 
20
- class ExceptionRequestWorker
21
- include Qwirk::QueueAdapter::JMS::RequestWorker
20
+ class ExceptionReplyWorker
21
+ include Qwirk::Adapter::JMS::ReplyWorker
22
22
 
23
23
  def request(obj)
24
24
  puts "#{name} received #{obj} but raising exception"
@@ -31,7 +31,7 @@ end
31
31
 
32
32
  # This will read from the queue that ExceptionWorker fails to
33
33
  class ExceptionFailWorker
34
- include Qwirk::QueueAdapter::JMS::Worker
34
+ include Qwirk::Adapter::JMS::Worker
35
35
 
36
36
  @@my_hash = {}
37
37
 
@@ -49,7 +49,7 @@ class JMSFailTest < Test::Unit::TestCase
49
49
 
50
50
  def assert_fail_queue(queue_name, fail_queue_name, value, is_fail_queue_expected)
51
51
  # Publish to Exception that will throw exception which will put on ExceptionFail queue
52
- publisher = Qwirk::QueueAdapter::JMS::Publisher.new(:queue_name => queue_name, :marshal => :string)
52
+ publisher = Qwirk::Adapter::JMS::Publisher.new(:queue_name => queue_name, :marshal => :string)
53
53
  puts "Publishing #{value} to #{queue_name}"
54
54
  publisher.publish(value)
55
55
  sleep 1
@@ -60,7 +60,7 @@ class JMSFailTest < Test::Unit::TestCase
60
60
  context 'jms' do
61
61
  setup do
62
62
  config = YAML.load(ERB.new(File.read(File.join(File.dirname(__FILE__), 'jms.yml'))).result(binding))
63
- Qwirk::QueueAdapter::JMS::Connection.init(config)
63
+ Qwirk::Adapter::JMS::Connection.init(config)
64
64
  end
65
65
 
66
66
  teardown do
@@ -97,28 +97,28 @@ class JMSFailTest < Test::Unit::TestCase
97
97
 
98
98
  # Should NOT receive message on the fail worker
99
99
  name = 'ExceptionRequest'
100
- @manager.add(ExceptionRequestWorker, 1)
100
+ @manager.add(ExceptionReplyWorker, 1)
101
101
  @manager.add(ExceptionFailWorker, 1, :name => "#{name}Fail")
102
102
 
103
103
  # Should NOT receive message on the fail worker when using specified names
104
104
  name = 'ExceptionRequestNameSpecified'
105
- @manager.add(ExceptionRequestWorker, 1, :name => name)
105
+ @manager.add(ExceptionReplyWorker, 1, :name => name)
106
106
  @manager.add(ExceptionFailWorker, 1, :name => "#{name}Fail")
107
107
 
108
108
  # Should receive message on the fail worker when using specified names and fail_queue set true
109
109
  name = 'ExceptionRequestFailQueueTrue'
110
- @manager.add(ExceptionRequestWorker, 1, :name => name, :fail_queue => true)
110
+ @manager.add(ExceptionReplyWorker, 1, :name => name, :fail_queue => true)
111
111
  @manager.add(ExceptionFailWorker, 1, :name => "#{name}Fail")
112
112
 
113
113
  # Should NOT receive message on the fail worker when using specified names and fail_queue set false
114
114
  name = 'ExceptionRequestFailQueueFalse'
115
- @manager.add(ExceptionRequestWorker, 1, :name => name, :fail_queue => false)
115
+ @manager.add(ExceptionReplyWorker, 1, :name => name, :fail_queue => false)
116
116
  @manager.add(ExceptionFailWorker, 1, :name => "#{name}Fail")
117
117
 
118
118
  # Should NOT receive message on the fail worker when using specified names and fail_queue set false
119
119
  name = 'ExceptionRequestFailQueueSpecified'
120
120
  fail_queue = 'MyRequestFailQueue'
121
- @manager.add(ExceptionRequestWorker, 1, :name => name, :fail_queue => fail_queue)
121
+ @manager.add(ExceptionReplyWorker, 1, :name => name, :fail_queue => fail_queue)
122
122
  @manager.add(ExceptionFailWorker, 1, :name => fail_queue)
123
123
 
124
124
  sleep 1