activemessaging 0.6.1 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +22 -0
- data/Rakefile +48 -26
- data/VERSION +1 -0
- data/activemessaging.gemspec +113 -0
- data/generators/filter/templates/filter_test.rb +1 -1
- data/generators/processor/templates/broker.yml +18 -7
- data/init.rb +3 -0
- data/lib/activemessaging.rb +0 -3
- data/lib/activemessaging/adapters/asqs.rb +69 -61
- data/lib/activemessaging/adapters/base.rb +51 -63
- data/lib/activemessaging/adapters/beanstalk.rb +88 -0
- data/lib/activemessaging/adapters/jms.rb +7 -7
- data/lib/activemessaging/adapters/reliable_msg.rb +136 -140
- data/lib/activemessaging/adapters/stomp.rb +90 -22
- data/lib/activemessaging/adapters/test.rb +7 -25
- data/lib/activemessaging/adapters/wmq.rb +7 -16
- data/lib/activemessaging/base_message.rb +19 -0
- data/lib/activemessaging/gateway.rb +38 -41
- data/lib/activemessaging/test_helper.rb +4 -9
- data/poller.rb +14 -0
- data/test/all_tests.rb +10 -0
- data/test/app/config/broker.yml +4 -0
- data/test/asqs_test.rb +102 -0
- data/test/config_test.rb +42 -0
- data/test/filter_test.rb +131 -0
- data/test/gateway_test.rb +195 -0
- data/test/jms_test.rb +61 -0
- data/test/reliable_msg_test.rb +83 -0
- data/test/stomp_test.rb +131 -0
- data/test/test_helper.rb +24 -0
- data/test/tracer_test.rb +57 -0
- metadata +69 -53
- data/messaging.rb.example +0 -5
data/README
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
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.
|
2
|
+
|
3
|
+
ActiveMessaging is a generic framework to ease using messaging, but is not tied to any particular messaging system - in fact, it now has support for Stomp, Amazon Simple Queue Service (SQS), Beanstalk, JMS (using StompConnect or [JMSWithJRuby direct on JRuby]), WebSphere MQ, and the all-Ruby ReliableMessaging.
|
4
|
+
|
5
|
+
Here's a sample of a processor class that handles incoming messages:
|
6
|
+
|
7
|
+
class HelloWorldProcessor < ActiveMessaging::Processor
|
8
|
+
|
9
|
+
subscribes_to :hello_world
|
10
|
+
|
11
|
+
def on_message(message)
|
12
|
+
puts "received: " + message
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
h1. Support
|
19
|
+
|
20
|
+
Best bet is the google groups mailing list:
|
21
|
+
|
22
|
+
http://groups.google.com/group/activemessaging-discuss
|
data/Rakefile
CHANGED
@@ -19,32 +19,54 @@ task :rdoc do
|
|
19
19
|
RDoc::RDoc.new.document(%w(--line-numbers --inline-source --title ActiveMessaging README lib))
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
s.files = FileList['generators/**/*', 'lib/**/*', 'tasks/**/*', 'Rakefile', 'messaging.rb.example'].to_a
|
34
|
-
s.homepage = %q{http://code.google.com/p/activemessaging/}
|
35
|
-
s.require_paths = ["lib"]
|
36
|
-
s.rubygems_version = %q{1.2.0}
|
37
|
-
s.summary = %q{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.}
|
38
|
-
#s.test_files = ["test"]
|
39
|
-
#s.autorequire = 'activemessaging'
|
40
|
-
s.has_rdoc = true
|
41
|
-
|
42
|
-
s.add_dependency(%q<activesupport>, [">= 1.0.0"])
|
43
|
-
s.add_dependency(%q<rubigen>, [">= 1.5.2"])
|
44
|
-
#s.add_dependency(%q<common-pool-cliffmoon>, [">= 0.0.3"])
|
45
|
-
end
|
22
|
+
begin
|
23
|
+
require 'jeweler'
|
24
|
+
Jeweler::Tasks.new do |gemspec|
|
25
|
+
|
26
|
+
# basic
|
27
|
+
gemspec.name = "activemessaging"
|
28
|
+
gemspec.summary = "Official activemessaging gem, now hosted on github.com/kookster. (kookster prefix temporary)"
|
29
|
+
gemspec.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."
|
30
|
+
gemspec.email = "activemessaging-discuss@googlegroups.com"
|
31
|
+
gemspec.homepage = "http://github.com/kookster/activemessaging"
|
32
|
+
gemspec.authors = ["Jon Tirsen", "Andrew Kuklewicz", "Olle Jonsson", "Sylvain Perez", "Cliff Moon", 'Uwe Kubosch']
|
46
33
|
|
47
|
-
|
48
|
-
|
34
|
+
# added
|
35
|
+
gemspec.add_dependency('activesupport', '>= 1.0.0')
|
36
|
+
|
37
|
+
end
|
38
|
+
Jeweler::GemcutterTasks.new
|
39
|
+
rescue LoadError
|
40
|
+
puts "Jeweler not available. Install it with: gem install jeweler"
|
49
41
|
end
|
50
42
|
|
43
|
+
|
44
|
+
# gem_spec = Gem::Specification.new do |s|
|
45
|
+
# s.name = %q{activemessaging}
|
46
|
+
# s.version = "0.6.1"
|
47
|
+
#
|
48
|
+
# s.specification_version = 2 if s.respond_to? :specification_version=
|
49
|
+
#
|
50
|
+
# s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
51
|
+
# s.authors = ["jon.tirsen", "kookster", "olle.jonsson", "sylvain.perez", "anti.god.botherer", 'uwe.kubosch']
|
52
|
+
# s.date = %q{2008-08-15}
|
53
|
+
# s.description = %q{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.}
|
54
|
+
# s.email = %q{activemessaging-discuss@googlegroups.com}
|
55
|
+
# s.files = FileList['generators/**/*', 'lib/**/*', 'tasks/**/*', 'Rakefile', 'messaging.rb.example'].to_a
|
56
|
+
# s.homepage = %q{http://code.google.com/p/activemessaging/}
|
57
|
+
# s.require_paths = ["lib"]
|
58
|
+
# s.rubygems_version = %q{1.2.0}
|
59
|
+
# s.summary = %q{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.}
|
60
|
+
# #s.test_files = ["test"]
|
61
|
+
# #s.autorequire = 'activemessaging'
|
62
|
+
# s.has_rdoc = true
|
63
|
+
#
|
64
|
+
# s.add_dependency(%q<activesupport>, [">= 1.0.0"])
|
65
|
+
# s.add_dependency(%q<rubigen>, [">= 1.5.2"])
|
66
|
+
# #s.add_dependency(%q<common-pool-cliffmoon>, [">= 0.0.3"])
|
67
|
+
# end
|
68
|
+
|
69
|
+
# desc 'Generate ActiveMessaging gem.'
|
70
|
+
# Rake::GemPackageTask.new(gem_spec) do |pkg|
|
71
|
+
# end
|
72
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.7.1
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{activemessaging}
|
8
|
+
s.version = "0.7.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Jon Tirsen", "Andrew Kuklewicz", "Olle Jonsson", "Sylvain Perez", "Cliff Moon", "Uwe Kubosch"]
|
12
|
+
s.date = %q{2010-04-08}
|
13
|
+
s.description = %q{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.}
|
14
|
+
s.email = %q{activemessaging-discuss@googlegroups.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"README",
|
20
|
+
"Rakefile",
|
21
|
+
"VERSION",
|
22
|
+
"activemessaging.gemspec",
|
23
|
+
"generators/a13g_test_harness/a13g_test_harness_generator.rb",
|
24
|
+
"generators/a13g_test_harness/templates/active_messaging_test.rhtml",
|
25
|
+
"generators/a13g_test_harness/templates/active_messaging_test_controller.rb",
|
26
|
+
"generators/a13g_test_harness/templates/index.rhtml",
|
27
|
+
"generators/filter/USAGE",
|
28
|
+
"generators/filter/filter_generator.rb",
|
29
|
+
"generators/filter/templates/filter.rb",
|
30
|
+
"generators/filter/templates/filter_test.rb",
|
31
|
+
"generators/processor/USAGE",
|
32
|
+
"generators/processor/processor_generator.rb",
|
33
|
+
"generators/processor/templates/application.rb",
|
34
|
+
"generators/processor/templates/broker.yml",
|
35
|
+
"generators/processor/templates/jruby_poller",
|
36
|
+
"generators/processor/templates/messaging.rb",
|
37
|
+
"generators/processor/templates/poller",
|
38
|
+
"generators/processor/templates/poller.rb",
|
39
|
+
"generators/processor/templates/processor.rb",
|
40
|
+
"generators/processor/templates/processor_test.rb",
|
41
|
+
"generators/tracer/USAGE",
|
42
|
+
"generators/tracer/templates/controller.rb",
|
43
|
+
"generators/tracer/templates/helper.rb",
|
44
|
+
"generators/tracer/templates/index.rhtml",
|
45
|
+
"generators/tracer/templates/layout.rhtml",
|
46
|
+
"generators/tracer/templates/trace_processor.rb",
|
47
|
+
"generators/tracer/tracer_generator.rb",
|
48
|
+
"init.rb",
|
49
|
+
"lib/activemessaging.rb",
|
50
|
+
"lib/activemessaging/adapter.rb",
|
51
|
+
"lib/activemessaging/adapters/asqs.rb",
|
52
|
+
"lib/activemessaging/adapters/base.rb",
|
53
|
+
"lib/activemessaging/adapters/beanstalk.rb",
|
54
|
+
"lib/activemessaging/adapters/jms.rb",
|
55
|
+
"lib/activemessaging/adapters/reliable_msg.rb",
|
56
|
+
"lib/activemessaging/adapters/stomp.rb",
|
57
|
+
"lib/activemessaging/adapters/test.rb",
|
58
|
+
"lib/activemessaging/adapters/wmq.rb",
|
59
|
+
"lib/activemessaging/base_message.rb",
|
60
|
+
"lib/activemessaging/filter.rb",
|
61
|
+
"lib/activemessaging/gateway.rb",
|
62
|
+
"lib/activemessaging/message_sender.rb",
|
63
|
+
"lib/activemessaging/named_base.rb",
|
64
|
+
"lib/activemessaging/processor.rb",
|
65
|
+
"lib/activemessaging/support.rb",
|
66
|
+
"lib/activemessaging/test_helper.rb",
|
67
|
+
"lib/activemessaging/trace_filter.rb",
|
68
|
+
"poller.rb",
|
69
|
+
"tasks/start_consumers.rake",
|
70
|
+
"test/all_tests.rb",
|
71
|
+
"test/app/config/broker.yml",
|
72
|
+
"test/asqs_test.rb",
|
73
|
+
"test/config_test.rb",
|
74
|
+
"test/filter_test.rb",
|
75
|
+
"test/gateway_test.rb",
|
76
|
+
"test/jms_test.rb",
|
77
|
+
"test/reliable_msg_test.rb",
|
78
|
+
"test/stomp_test.rb",
|
79
|
+
"test/test_helper.rb",
|
80
|
+
"test/tracer_test.rb"
|
81
|
+
]
|
82
|
+
s.homepage = %q{http://github.com/kookster/activemessaging}
|
83
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
84
|
+
s.require_paths = ["lib"]
|
85
|
+
s.rubygems_version = %q{1.3.5}
|
86
|
+
s.summary = %q{Official activemessaging gem, now hosted on github.com/kookster. (kookster prefix temporary)}
|
87
|
+
s.test_files = [
|
88
|
+
"test/all_tests.rb",
|
89
|
+
"test/asqs_test.rb",
|
90
|
+
"test/config_test.rb",
|
91
|
+
"test/filter_test.rb",
|
92
|
+
"test/gateway_test.rb",
|
93
|
+
"test/jms_test.rb",
|
94
|
+
"test/reliable_msg_test.rb",
|
95
|
+
"test/stomp_test.rb",
|
96
|
+
"test/test_helper.rb",
|
97
|
+
"test/tracer_test.rb"
|
98
|
+
]
|
99
|
+
|
100
|
+
if s.respond_to? :specification_version then
|
101
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
102
|
+
s.specification_version = 3
|
103
|
+
|
104
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
105
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 1.0.0"])
|
106
|
+
else
|
107
|
+
s.add_dependency(%q<activesupport>, [">= 1.0.0"])
|
108
|
+
end
|
109
|
+
else
|
110
|
+
s.add_dependency(%q<activesupport>, [">= 1.0.0"])
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
@@ -20,7 +20,7 @@ class <%= class_name %>FilterTest < Test::Unit::TestCase
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_<%= file_name %>_filter
|
23
|
-
@message = ActiveMessaging::TestMessage.new(
|
23
|
+
@message = ActiveMessaging::TestMessage.new('message body', {'message-id'=>'test-message-id-header'}, @destination.value )
|
24
24
|
@routing = {:direction=>:incoming, :destination=>@destination}
|
25
25
|
@filter.process(@message, @routing)
|
26
26
|
end
|
@@ -27,13 +27,14 @@ development:
|
|
27
27
|
# If error still occurs after retryMax, send message to specified dead letter queue
|
28
28
|
# deadLetterQueue: '/queue/activemessaging/deadletter'
|
29
29
|
|
30
|
+
################################
|
31
|
+
# Beanstalk Adapter Properties #
|
32
|
+
################################
|
33
|
+
# adapter: beanstalk
|
34
|
+
# host: localhost
|
30
35
|
|
31
|
-
|
32
|
-
#
|
33
|
-
###################################
|
34
|
-
# adapter: wmq
|
35
|
-
# q_mgr_name: ""
|
36
|
-
# poll_interval: .1
|
36
|
+
## properties below are all defaults for this adapter
|
37
|
+
# port: 11300
|
37
38
|
|
38
39
|
|
39
40
|
#################################
|
@@ -61,8 +62,18 @@ development:
|
|
61
62
|
|
62
63
|
## properties below are all defaults for this adapter
|
63
64
|
# poll_interval: 1
|
64
|
-
# reliable: true
|
65
|
+
# reliable: true
|
66
|
+
|
67
|
+
|
68
|
+
###################################
|
69
|
+
# Websphere MQ Adapter Properties #
|
70
|
+
###################################
|
71
|
+
# adapter: wmq
|
72
|
+
# q_mgr_name: ""
|
73
|
+
# poll_interval: .1
|
74
|
+
|
65
75
|
|
76
|
+
|
66
77
|
test:
|
67
78
|
adapter: test
|
68
79
|
reliable: false
|
data/init.rb
ADDED
data/lib/activemessaging.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
module ActiveMessaging
|
2
|
-
VERSION = "0.6.1"
|
3
2
|
APP_ROOT = ENV['APP_ROOT'] || ENV['RAILS_ROOT'] || ((defined? RAILS_ROOT) && RAILS_ROOT) || File.dirname($0)
|
4
3
|
APP_ENV = ENV['APP_ENV'] || ENV['RAILS_ENV'] || 'development'
|
5
4
|
ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
@@ -49,9 +48,7 @@ module ActiveMessaging
|
|
49
48
|
end
|
50
49
|
|
51
50
|
def self.load_config
|
52
|
-
p APP_ROOT
|
53
51
|
path = File.expand_path("#{APP_ROOT}/config/messaging.rb")
|
54
|
-
p path
|
55
52
|
begin
|
56
53
|
load path
|
57
54
|
rescue MissingSourceFile
|
@@ -1,22 +1,22 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'net/http'
|
3
|
+
require 'net/https'
|
3
4
|
require 'openssl'
|
4
5
|
require 'base64'
|
5
6
|
require 'cgi'
|
6
7
|
require 'time'
|
7
|
-
require '
|
8
|
+
require 'uri'
|
9
|
+
|
10
|
+
require 'activemessaging/adapters/base'
|
8
11
|
|
9
12
|
module ActiveMessaging
|
10
13
|
module Adapters
|
11
|
-
module
|
12
|
-
|
13
|
-
class Connection
|
14
|
-
include ActiveMessaging::Adapter
|
14
|
+
module AmazonSqs
|
15
15
|
|
16
|
+
class Connection < ActiveMessaging::Adapters::BaseConnection
|
16
17
|
register :asqs
|
17
18
|
|
18
19
|
QUEUE_NAME_LENGTH = 1..80
|
19
|
-
# MESSAGE_SIZE = 1..(256 * 1024)
|
20
20
|
MESSAGE_SIZE = 1..(8 * 1024)
|
21
21
|
VISIBILITY_TIMEOUT = 0..(24 * 60 * 60)
|
22
22
|
NUMBER_OF_MESSAGES = 1..255
|
@@ -24,37 +24,38 @@ module ActiveMessaging
|
|
24
24
|
SET_QUEUE_ATTRIBUTES = ['VisibilityTimeout']
|
25
25
|
|
26
26
|
#configurable params
|
27
|
-
attr_accessor :
|
28
|
-
|
27
|
+
attr_accessor :reconnectDelay, :access_key_id, :secret_access_key, :aws_version, :content_type, :host, :port, :poll_interval, :cache_queue_list
|
28
|
+
|
29
29
|
#generic init method needed by a13g
|
30
30
|
def initialize cfg
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
31
|
+
raise "Must specify a access_key_id" if (cfg[:access_key_id].nil? || cfg[:access_key_id].empty?)
|
32
|
+
raise "Must specify a secret_access_key" if (cfg[:secret_access_key].nil? || cfg[:secret_access_key].empty?)
|
33
|
+
|
34
|
+
@access_key_id=cfg[:access_key_id]
|
35
|
+
@secret_access_key=cfg[:secret_access_key]
|
36
|
+
@request_expires = cfg[:requestExpires] || 10
|
37
|
+
@request_retry_count = cfg[:requestRetryCount] || 5
|
38
|
+
@aws_version = cfg[:aws_version] || '2008-01-01'
|
39
|
+
@content_type = cfg[:content_type] || 'text/plain'
|
40
|
+
@host = cfg[:host] || 'queue.amazonaws.com'
|
41
|
+
@port = cfg[:port] || 80
|
42
|
+
@protocol = cfg[:protocol] || 'http'
|
43
|
+
@poll_interval = cfg[:poll_interval] || 1
|
44
|
+
@reconnect_delay = cfg[:reconnectDelay] || 5
|
45
|
+
@aws_url="#{@protocol}://#{@host}"
|
46
|
+
|
47
|
+
@cache_queue_list = cfg[:cache_queue_list].nil? ? true : cfg[:cache_queue_list]
|
48
|
+
@reliable = cfg[:reliable].nil? ? true : cfg[:reliable]
|
49
|
+
|
50
|
+
#initialize the subscriptions and queues
|
51
|
+
@subscriptions = {}
|
52
|
+
@current_subscription = 0
|
53
|
+
queues
|
54
54
|
end
|
55
55
|
|
56
56
|
def disconnect
|
57
57
|
#it's an http request - there is no disconnect - ha!
|
58
|
+
return true
|
58
59
|
end
|
59
60
|
|
60
61
|
# queue_name string, headers hash
|
@@ -108,18 +109,18 @@ module ActiveMessaging
|
|
108
109
|
begin
|
109
110
|
delete_message message
|
110
111
|
rescue Object=>exception
|
111
|
-
logger.error "Exception in ActiveMessaging::Adapters::
|
112
|
+
logger.error "Exception in ActiveMessaging::Adapters::AmazonSWS::Connection.received() logged and ignored: "
|
112
113
|
logger.error exception
|
113
114
|
end
|
114
115
|
end
|
115
116
|
|
117
|
+
# do nothing; by not deleting the message will eventually become visible again
|
116
118
|
def unreceive message, headers={}
|
117
|
-
# do nothing; by not deleting the message will eventually become visible again
|
118
119
|
return true
|
119
120
|
end
|
120
|
-
|
121
|
+
|
121
122
|
protected
|
122
|
-
|
123
|
+
|
123
124
|
def create_queue(name)
|
124
125
|
validate_new_queue name
|
125
126
|
response = make_request('CreateQueue', nil, {'QueueName'=>name})
|
@@ -137,7 +138,7 @@ module ActiveMessaging
|
|
137
138
|
response = make_request('ListQueues', nil, params)
|
138
139
|
response.nil? ? [] : response.nodes("//QueueUrl").collect{ |n| add_queue(n.text) }
|
139
140
|
end
|
140
|
-
|
141
|
+
|
141
142
|
def get_queue_attributes(queue, attribute='All')
|
142
143
|
validate_get_queue_attribute(attribute)
|
143
144
|
params = {'AttributeName'=>attribute}
|
@@ -185,7 +186,7 @@ module ActiveMessaging
|
|
185
186
|
response = make_request('ReceiveMessage', "#{queue.queue_url}", params)
|
186
187
|
response.nodes("//Message").collect{ |n| Message.from_element n, response, queue } unless response.nil?
|
187
188
|
end
|
188
|
-
|
189
|
+
|
189
190
|
def delete_message message
|
190
191
|
response = make_request('DeleteMessage', "#{message.queue.queue_url}", {'ReceiptHandle'=>message.receipt_handle})
|
191
192
|
end
|
@@ -193,7 +194,7 @@ module ActiveMessaging
|
|
193
194
|
def make_request(action, url=nil, params = {})
|
194
195
|
# puts "make_request a=#{action} u=#{url} p=#{params}"
|
195
196
|
url ||= @aws_url
|
196
|
-
|
197
|
+
|
197
198
|
# Add Actions
|
198
199
|
params['Action'] = action
|
199
200
|
params['Version'] = @aws_version
|
@@ -238,14 +239,22 @@ module ActiveMessaging
|
|
238
239
|
return Net::HTTP.start(h, p){ |http| http.request(r) }
|
239
240
|
end
|
240
241
|
|
242
|
+
def http_request h, p, r
|
243
|
+
http = Net::HTTP.new(h, p)
|
244
|
+
http.use_ssl = true if "https" == @protocol
|
245
|
+
# Don't carp about SSL cert verification
|
246
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
247
|
+
return http.request(r)
|
248
|
+
end
|
249
|
+
|
241
250
|
def check_errors(response)
|
242
251
|
raise "http response was nil" if (response.nil?)
|
243
252
|
raise response.errors if (response && response.errors?)
|
244
253
|
response
|
245
254
|
end
|
246
|
-
|
255
|
+
|
247
256
|
private
|
248
|
-
|
257
|
+
|
249
258
|
# internal data structure methods
|
250
259
|
def add_queue(url)
|
251
260
|
q = Queue.from_url url
|
@@ -300,19 +309,18 @@ module ActiveMessaging
|
|
300
309
|
def validate_number_of_messages nom
|
301
310
|
raise "Number of messages, #{nom}, must be between #{NUMBER_OF_MESSAGES.min} and #{NUMBER_OF_MESSAGES.max}." unless NUMBER_OF_MESSAGES.include?(nom)
|
302
311
|
end
|
303
|
-
|
304
312
|
end
|
305
313
|
|
306
314
|
class SQSResponse
|
307
315
|
attr_accessor :headers, :doc, :http_response
|
308
|
-
|
316
|
+
|
309
317
|
def initialize response
|
310
318
|
# puts "response.body = #{response.body}"
|
311
319
|
@http_response = response
|
312
320
|
@headers = response.to_hash()
|
313
321
|
@doc = REXML::Document.new(response.body)
|
314
322
|
end
|
315
|
-
|
323
|
+
|
316
324
|
def message_type
|
317
325
|
return doc ? doc.root.name : ''
|
318
326
|
end
|
@@ -335,16 +343,16 @@ module ActiveMessaging
|
|
335
343
|
|
336
344
|
return msg
|
337
345
|
end
|
338
|
-
|
346
|
+
|
339
347
|
def get_text(xpath,default='')
|
340
348
|
e = REXML::XPath.first( doc, xpath)
|
341
349
|
e.nil? ? default : e.text
|
342
350
|
end
|
343
|
-
|
351
|
+
|
344
352
|
def each_node(xp)
|
345
353
|
REXML::XPath.each(doc.root, xp) {|n| yield n}
|
346
354
|
end
|
347
|
-
|
355
|
+
|
348
356
|
def nodes(xp)
|
349
357
|
doc.elements.to_a(xp)
|
350
358
|
end
|
@@ -352,11 +360,11 @@ module ActiveMessaging
|
|
352
360
|
|
353
361
|
class Subscription
|
354
362
|
attr_accessor :name, :headers, :count
|
355
|
-
|
363
|
+
|
356
364
|
def initialize(destination, headers={}, count=1)
|
357
365
|
@destination, @headers, @count = destination, headers, count
|
358
366
|
end
|
359
|
-
|
367
|
+
|
360
368
|
def add
|
361
369
|
@count += 1
|
362
370
|
end
|
@@ -364,15 +372,16 @@ module ActiveMessaging
|
|
364
372
|
def remove
|
365
373
|
@count -= 1
|
366
374
|
end
|
367
|
-
|
368
375
|
end
|
369
376
|
|
370
377
|
class Queue
|
371
378
|
attr_accessor :name, :pathinfo, :domain, :visibility_timeout
|
372
379
|
|
373
380
|
def self.from_url url
|
374
|
-
|
375
|
-
|
381
|
+
u = URI.parse(url)
|
382
|
+
name = u.path.gsub(/\//, "")
|
383
|
+
domain = u.host
|
384
|
+
return Queue.new(name,domain)
|
376
385
|
end
|
377
386
|
|
378
387
|
def queue_url
|
@@ -389,21 +398,20 @@ module ActiveMessaging
|
|
389
398
|
end
|
390
399
|
|
391
400
|
# based on stomp message, has pointer to the SQSResponseObject
|
392
|
-
class Message
|
393
|
-
attr_accessor :
|
394
|
-
|
401
|
+
class Message < ActiveMessaging::BaseMessage
|
402
|
+
attr_accessor :response, :queue, :md5_of_body, :receipt_handle
|
403
|
+
|
395
404
|
def self.from_element e, response, queue
|
396
|
-
Message.new(
|
405
|
+
Message.new(e.elements['Body'].text, response.headers, e.elements['MessageId'].text, e.elements['MD5OfBody'].text, e.elements['ReceiptHandle'].text, response, queue)
|
397
406
|
end
|
398
|
-
|
399
|
-
def initialize headers, id,
|
400
|
-
|
401
|
-
|
407
|
+
|
408
|
+
def initialize body, headers, id, md5_of_body, receipt_handle, response, queue
|
409
|
+
super(body, id, headers, queue.name)
|
410
|
+
@md5_of_body, @receipt_handle, @response, @queue = md5_of_body, receipt_handle, response, queue
|
402
411
|
end
|
403
412
|
|
404
|
-
|
405
413
|
def to_s
|
406
|
-
"<AmazonSQS::Message id='#{id}' body='#{body}' headers='#{headers.inspect}'
|
414
|
+
"<AmazonSQS::Message id='#{id}' body='#{body}' headers='#{headers.inspect}' response='#{response}'>"
|
407
415
|
end
|
408
416
|
end
|
409
417
|
|