modern_times 0.2.2 → 0.2.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.
- data/VERSION +1 -1
- data/examples/exception_test/bar_worker.rb +8 -0
- data/examples/exception_test/base_worker.rb +23 -0
- data/examples/exception_test/manager.rb +11 -0
- data/examples/requestor/reverse_echo_worker.rb +3 -0
- data/lib/modern_times.rb +1 -1
- data/lib/modern_times/base/worker.rb +1 -1
- data/lib/modern_times/jms.rb +12 -0
- data/lib/modern_times/jms/publisher.rb +1 -9
- data/lib/modern_times/jms_requestor/request_handle.rb +4 -0
- data/lib/modern_times/jms_requestor/worker.rb +22 -7
- data/lib/modern_times/manager.rb +3 -3
- data/lib/modern_times/marshal_strategy.rb +2 -0
- data/lib/modern_times/marshal_strategy/yaml.rb +19 -0
- data/lib/modern_times/railsable.rb +1 -1
- data/lib/modern_times/remote_exception.rb +42 -0
- data/test/base_test.rb +2 -2
- data/test/jms_test.rb +2 -2
- metadata +8 -4
- data/lib/modern_times/exception.rb +0 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.3
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class BaseWorker
|
2
|
+
include ModernTimes::Base::Worker
|
3
|
+
|
4
|
+
def start
|
5
|
+
while true do
|
6
|
+
sleep 1
|
7
|
+
perform
|
8
|
+
end
|
9
|
+
rescue Exception => e
|
10
|
+
puts "Caught #{e.inspect}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def perform
|
14
|
+
raise "Need to override perform method in #{self.class.name}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def stop
|
18
|
+
end
|
19
|
+
|
20
|
+
def status
|
21
|
+
"Need to override status method in #{self.class.name}"
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Allow examples to be run in-place without requiring a gem install
|
2
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'modern_times'
|
6
|
+
require 'bar_worker'
|
7
|
+
|
8
|
+
manager = ModernTimes::Manager.new
|
9
|
+
manager.stop_on_signal
|
10
|
+
manager.add(BarWorker, 2, {})
|
11
|
+
manager.join
|
data/lib/modern_times.rb
CHANGED
data/lib/modern_times/jms.rb
CHANGED
@@ -19,5 +19,17 @@ module ModernTimes
|
|
19
19
|
return false
|
20
20
|
end
|
21
21
|
end
|
22
|
+
|
23
|
+
def self.create_message(session, marshaler, object)
|
24
|
+
case marshaler.marshal_type
|
25
|
+
when :text
|
26
|
+
session.create_text_message(marshaler.marshal(object))
|
27
|
+
when :bytes
|
28
|
+
msg = session.create_bytes_message()
|
29
|
+
msg.data = marshaler.marshal(object)
|
30
|
+
msg
|
31
|
+
else raise "Invalid marshal type: #{marshaler.marshal_type}"
|
32
|
+
end
|
33
|
+
end
|
22
34
|
end
|
23
35
|
end
|
@@ -38,15 +38,7 @@ module ModernTimes
|
|
38
38
|
def publish(object, props={})
|
39
39
|
message = nil
|
40
40
|
Connection.session_pool.producer(@real_producer_options) do |session, producer|
|
41
|
-
message =
|
42
|
-
when :text
|
43
|
-
session.create_text_message(@marshaler.marshal(object))
|
44
|
-
when :bytes
|
45
|
-
msg = session.create_bytes_message()
|
46
|
-
msg.data = @marshaler.marshal(object)
|
47
|
-
msg
|
48
|
-
else raise "Invalid marshal type: #{@marshaler.marshal_type}"
|
49
|
-
end
|
41
|
+
message = ModernTimes::JMS.create_message(session, @marshaler, object)
|
50
42
|
message.jms_delivery_mode_sym = @persistent
|
51
43
|
props.each do |key, value|
|
52
44
|
message.send("#{key}=", value)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'timeout'
|
2
|
+
require 'yaml'
|
2
3
|
|
3
4
|
module ModernTimes
|
4
5
|
module JMSRequestor
|
@@ -26,6 +27,9 @@ module ModernTimes
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
raise Timeout::Error, "Timeout waiting for for response from message #{@message.jms_message_id} on queue #{@reply_queue}" unless response
|
30
|
+
if error_yaml = response['Exception']
|
31
|
+
raise ModernTimes::RemoteException.from_hash(YAML.load(error_yaml))
|
32
|
+
end
|
29
33
|
return @requestor.marshaler.unmarshal(response.data)
|
30
34
|
end
|
31
35
|
end
|
@@ -4,6 +4,7 @@ module ModernTimes
|
|
4
4
|
# Base Worker Class for any class that will be processing messages from queues
|
5
5
|
module Worker
|
6
6
|
include ModernTimes::JMS::Worker
|
7
|
+
attr_reader :error_count
|
7
8
|
|
8
9
|
module ClassMethods
|
9
10
|
def create_supervisor(manager, worker_options)
|
@@ -20,11 +21,12 @@ module ModernTimes
|
|
20
21
|
|
21
22
|
def initialize(opts={})
|
22
23
|
super
|
23
|
-
@time_mutex
|
24
|
-
@count
|
25
|
-
@
|
26
|
-
@
|
27
|
-
@
|
24
|
+
@time_mutex = Mutex.new
|
25
|
+
@count = 0
|
26
|
+
@error_count = 0
|
27
|
+
@min_time = nil
|
28
|
+
@max_time = 0.0
|
29
|
+
@total_time = 0.0
|
28
30
|
end
|
29
31
|
|
30
32
|
def perform(object)
|
@@ -32,9 +34,8 @@ module ModernTimes
|
|
32
34
|
response = request(object)
|
33
35
|
response_time = Time.now - start_time
|
34
36
|
session.producer(:destination => message.reply_to) do |producer|
|
35
|
-
reply_message =
|
37
|
+
reply_message = ModernTimes::JMS.create_message(session, self.class.marshaler, response)
|
36
38
|
reply_message.jms_correlation_id = message.jms_message_id
|
37
|
-
#producer.send_with_retry(reply_message)
|
38
39
|
producer.send(reply_message)
|
39
40
|
end
|
40
41
|
@time_mutex.synchronize do
|
@@ -43,6 +44,20 @@ module ModernTimes
|
|
43
44
|
@min_time = response_time if !@min_time || response_time < @min_time
|
44
45
|
@max_time = response_time if response_time > @max_time
|
45
46
|
end
|
47
|
+
rescue Exception => e
|
48
|
+
@time_mutex.synchronize do
|
49
|
+
@error_count += 1
|
50
|
+
end
|
51
|
+
begin
|
52
|
+
session.producer(:destination => message.reply_to) do |producer|
|
53
|
+
reply_message = ModernTimes::JMS.create_message(session, ModernTimes::MarshalStrategy::String, "Exception: #{e.message}")
|
54
|
+
reply_message.jms_correlation_id = message.jms_message_id
|
55
|
+
reply_message['Exception'] = ModernTimes::RemoteException.new(e).to_hash.to_yaml
|
56
|
+
producer.send(reply_message)
|
57
|
+
end
|
58
|
+
rescue Exception => e
|
59
|
+
ModernTimes.logger.error("Exception in exception reply: #{e.message}\n\t#{e.backtrace.join("\n\t")}")
|
60
|
+
end
|
46
61
|
end
|
47
62
|
|
48
63
|
def total_time
|
data/lib/modern_times/manager.rb
CHANGED
@@ -24,14 +24,14 @@ module ModernTimes
|
|
24
24
|
begin
|
25
25
|
worker_klass = Object.const_get(worker_klass.to_s)
|
26
26
|
rescue
|
27
|
-
raise
|
27
|
+
raise "Invalid class: #{worker_klass}"
|
28
28
|
end
|
29
29
|
end
|
30
30
|
if @allowed_workers && !@allowed_workers.include?(worker_klass)
|
31
|
-
raise
|
31
|
+
raise "Error: #{worker_klass.name} is not an allowed worker"
|
32
32
|
end
|
33
33
|
supervisor = worker_klass.create_supervisor(self, worker_options)
|
34
|
-
raise
|
34
|
+
raise "A supervisor with name #{supervisor.name} already exists" if find_supervisor(supervisor.name)
|
35
35
|
mbean = supervisor.create_mbean(@domain)
|
36
36
|
@supervisors << supervisor
|
37
37
|
supervisor.worker_count = num_workers
|
@@ -2,6 +2,7 @@ require 'modern_times/marshal_strategy/bson'
|
|
2
2
|
require 'modern_times/marshal_strategy/json'
|
3
3
|
require 'modern_times/marshal_strategy/ruby'
|
4
4
|
require 'modern_times/marshal_strategy/string'
|
5
|
+
require 'modern_times/marshal_strategy/yaml'
|
5
6
|
|
6
7
|
# Defines some default marshaling strategies for use in marshaling/unmarshaling objects
|
7
8
|
# written and read via jms. Implementing classes must define the following methods:
|
@@ -35,6 +36,7 @@ module ModernTimes
|
|
35
36
|
when :string then String
|
36
37
|
when :json then JSON
|
37
38
|
when :bson then BSON
|
39
|
+
when :yaml then YAML
|
38
40
|
else raise "Invalid marshal strategy: #{options[:marshal]}"
|
39
41
|
end
|
40
42
|
elsif marshal_option.respond_to?(:marshal_type)
|
@@ -45,7 +45,7 @@ module ModernTimes
|
|
45
45
|
Rails.logger.info "Messaging disabled"
|
46
46
|
@is_jms_enabled = false
|
47
47
|
ModernTimes::JMS::Publisher.setup_dummy_publishing(rails_workers)
|
48
|
-
ModernTimes::JMSRequestor::Requestor.
|
48
|
+
ModernTimes::JMSRequestor::Requestor.setup_dummy_requesting(rails_workers)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module ModernTimes
|
2
|
+
class RemoteException < Exception
|
3
|
+
attr_accessor :originating_exception_name
|
4
|
+
attr_accessor :originating_exception_message
|
5
|
+
|
6
|
+
def initialize(originating_exception=nil, message=nil)
|
7
|
+
super(message)
|
8
|
+
if originating_exception
|
9
|
+
@originating_exception_name = originating_exception.class.name
|
10
|
+
@originating_exception_message = originating_exception.message
|
11
|
+
set_backtrace(originating_exception.backtrace)
|
12
|
+
end
|
13
|
+
@message = message
|
14
|
+
end
|
15
|
+
|
16
|
+
def message
|
17
|
+
@message || @originating_exception_message
|
18
|
+
end
|
19
|
+
|
20
|
+
def message=(msg)
|
21
|
+
@message = msg
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_hash
|
25
|
+
{
|
26
|
+
'message' => @message,
|
27
|
+
'originating_exception_name' => @originating_exception_name,
|
28
|
+
'originating_exception_message' => @originating_exception_message,
|
29
|
+
'backtrace' => backtrace
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.from_hash(hash)
|
34
|
+
exc = new
|
35
|
+
exc.message = hash['message']
|
36
|
+
exc.originating_exception_name = hash['originating_exception_name']
|
37
|
+
exc.originating_exception_message = hash['originating_exception_message']
|
38
|
+
exc.set_backtrace(hash['backtrace'])
|
39
|
+
return exc
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/test/base_test.rb
CHANGED
@@ -130,12 +130,12 @@ class BaseTest < Test::Unit::TestCase
|
|
130
130
|
end
|
131
131
|
|
132
132
|
should "not be allowed" do
|
133
|
-
e = assert_raises
|
133
|
+
e = assert_raises RuntimeError do
|
134
134
|
@manager.add(DummyWorker, 2, {:foo => 42})
|
135
135
|
end
|
136
136
|
assert_match %r%is not an allowed worker%, e.message
|
137
137
|
|
138
|
-
e = assert_raises
|
138
|
+
e = assert_raises RuntimeError do
|
139
139
|
@manager.add('FdajfsdklasdfWorker', 2, {:foo => 42})
|
140
140
|
end
|
141
141
|
assert_match %r%Invalid class%, e.message
|
data/test/jms_test.rb
CHANGED
@@ -202,8 +202,8 @@ class JMSTest < Test::Unit::TestCase
|
|
202
202
|
teardown do
|
203
203
|
end
|
204
204
|
|
205
|
-
|
206
|
-
[BSONTest, JSONTest, StringTest].each do |marshal_module|
|
205
|
+
[BSONTest, JSONTest, RubyTest, StringTest].each do |marshal_module|
|
206
|
+
#[BSONTest, JSONTest, StringTest].each do |marshal_module|
|
207
207
|
marshal_module.name =~ /(.*)Test/
|
208
208
|
marshal_type = $1
|
209
209
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 3
|
9
|
+
version: 0.2.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Brad Pardee
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-04-
|
18
|
+
date: 2011-04-28 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -79,7 +79,6 @@ files:
|
|
79
79
|
- lib/modern_times/base/supervisor.rb
|
80
80
|
- lib/modern_times/base/supervisor_mbean.rb
|
81
81
|
- lib/modern_times/base/worker.rb
|
82
|
-
- lib/modern_times/exception.rb
|
83
82
|
- lib/modern_times/jms.rb
|
84
83
|
- lib/modern_times/jms/connection.rb
|
85
84
|
- lib/modern_times/jms/publisher.rb
|
@@ -100,7 +99,9 @@ files:
|
|
100
99
|
- lib/modern_times/marshal_strategy/json.rb
|
101
100
|
- lib/modern_times/marshal_strategy/ruby.rb
|
102
101
|
- lib/modern_times/marshal_strategy/string.rb
|
102
|
+
- lib/modern_times/marshal_strategy/yaml.rb
|
103
103
|
- lib/modern_times/railsable.rb
|
104
|
+
- lib/modern_times/remote_exception.rb
|
104
105
|
- test/base_test.rb
|
105
106
|
- test/jms.yml
|
106
107
|
- test/jms_requestor_test.rb
|
@@ -137,6 +138,9 @@ signing_key:
|
|
137
138
|
specification_version: 3
|
138
139
|
summary: Asynchronous task library
|
139
140
|
test_files:
|
141
|
+
- examples/exception_test/bar_worker.rb
|
142
|
+
- examples/exception_test/base_worker.rb
|
143
|
+
- examples/exception_test/manager.rb
|
140
144
|
- examples/requestor/manager.rb
|
141
145
|
- examples/requestor/request.rb
|
142
146
|
- examples/requestor/reverse_echo_worker.rb
|