leandrosilva-sparrow 1.0.0
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/LICENSE +20 -0
- data/README.rdoc +7 -0
- data/Rakefile +49 -0
- data/VERSION.yml +4 -0
- data/lib/connection.rb +157 -0
- data/lib/jee/javaee-1.5.jar +0 -0
- data/lib/jee/jms.jar +0 -0
- data/lib/jee/sparrow-essential.jar +0 -0
- data/lib/jee.rb +14 -0
- data/lib/messaging.rb +230 -0
- data/lib/sparrow.rb +9 -0
- data/lib/utils.rb +11 -0
- data/spec/connection_spec.rb +72 -0
- data/spec/messaging_spec.rb +132 -0
- data/spec/spec_helper.rb +54 -0
- metadata +70 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Leandro Silva
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "sparrow"
|
8
|
+
gem.summary = %Q{Sparrow is a JMS client (JRuby based)}
|
9
|
+
gem.email = "leandrodoze@gmail.com"
|
10
|
+
gem.homepage = "http://github.com/leandrosilva/sparrow"
|
11
|
+
gem.authors = ["Leandro Silva"]
|
12
|
+
gem.files = FileList["[A-Z]*", "{lib,spec}/**/*"]
|
13
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
14
|
+
end
|
15
|
+
rescue LoadError
|
16
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'rake/rdoctask'
|
20
|
+
Rake::RDocTask.new do |rdoc|
|
21
|
+
rdoc.rdoc_dir = 'rdoc'
|
22
|
+
rdoc.title = 'sparrow'
|
23
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
24
|
+
rdoc.rdoc_files.include('README*')
|
25
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
26
|
+
end
|
27
|
+
|
28
|
+
require 'rake/testtask'
|
29
|
+
Rake::TestTask.new(:test) do |test|
|
30
|
+
test.libs << 'lib' << 'test'
|
31
|
+
test.pattern = 'test/**/*_test.rb'
|
32
|
+
test.verbose = false
|
33
|
+
end
|
34
|
+
|
35
|
+
begin
|
36
|
+
require 'rcov/rcovtask'
|
37
|
+
Rcov::RcovTask.new do |test|
|
38
|
+
test.libs << 'test'
|
39
|
+
test.pattern = 'test/**/*_test.rb'
|
40
|
+
test.verbose = true
|
41
|
+
end
|
42
|
+
rescue LoadError
|
43
|
+
task :rcov do
|
44
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
task :default => :test
|
data/VERSION.yml
ADDED
data/lib/connection.rb
ADDED
@@ -0,0 +1,157 @@
|
|
1
|
+
# Classes java usadas nesse arquivo
|
2
|
+
import 'java.util.Hashtable'
|
3
|
+
import 'javax.naming.InitialContext'
|
4
|
+
|
5
|
+
module Sparrow
|
6
|
+
module JMS
|
7
|
+
module Connection
|
8
|
+
|
9
|
+
#
|
10
|
+
# Configura��es necess�rias para que clientes JMS se conectem
|
11
|
+
# ao servidor de aplica��es Java EE via JNDI Context.
|
12
|
+
#
|
13
|
+
class Properties
|
14
|
+
attr_accessor :client_jar_file,
|
15
|
+
:initial_context_factory, :provider_url,
|
16
|
+
:security_principal, :security_credentials
|
17
|
+
|
18
|
+
#
|
19
|
+
# Cria um Hashtable Java contendo as configura��es atuais.
|
20
|
+
#
|
21
|
+
def to_jndi_environment_hashtable
|
22
|
+
jndi_env = Hashtable.new
|
23
|
+
|
24
|
+
jndi_env.put(
|
25
|
+
InitialContext::INITIAL_CONTEXT_FACTORY, @initial_context_factory)
|
26
|
+
|
27
|
+
jndi_env.put(
|
28
|
+
InitialContext::PROVIDER_URL, @provider_url)
|
29
|
+
|
30
|
+
jndi_env.put(
|
31
|
+
InitialContext::SECURITY_PRINCIPAL, @security_principal)
|
32
|
+
|
33
|
+
jndi_env.put(
|
34
|
+
InitialContext::SECURITY_CREDENTIALS, @security_credentials)
|
35
|
+
|
36
|
+
jndi_env
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
# Constroi um contexto JNDI inicial a partir das configura��es atuais.
|
41
|
+
#
|
42
|
+
def build_jndi_context
|
43
|
+
# Carrega a biblioteca cliente do servidor de aplica��es
|
44
|
+
require @client_jar_file
|
45
|
+
|
46
|
+
InitialContext.new(to_jndi_environment_hashtable)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# Cliente JMS que possibilita a conex�o com o servidor de aplica��es Java EE
|
52
|
+
# que prov� o servi�o JMS.
|
53
|
+
#
|
54
|
+
class Client
|
55
|
+
attr_reader :properties
|
56
|
+
|
57
|
+
def initialize(&configurator)
|
58
|
+
@properties = Properties.new
|
59
|
+
|
60
|
+
begin
|
61
|
+
configurator.call(@properties)
|
62
|
+
|
63
|
+
@jndi_context = properties.build_jndi_context
|
64
|
+
rescue => cause
|
65
|
+
raise ClientInitializationError.new(@properties, cause)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Conex�es, filas, t�picos, senders e receivers que ser�o habilitados
|
69
|
+
@connection_factories = {}
|
70
|
+
@queues = {}
|
71
|
+
@queue_senders = {}
|
72
|
+
@queue_receivers = {}
|
73
|
+
@topics = {}
|
74
|
+
@topic_senders = {}
|
75
|
+
@topic_receivers = {}
|
76
|
+
end
|
77
|
+
|
78
|
+
def enable_connection_factories(jndi_names={})
|
79
|
+
jndi_names.each_pair do |key, jndi_name|
|
80
|
+
@connection_factories[key] = @jndi_context.lookup(jndi_name)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def queue_connection_factory
|
85
|
+
@connection_factories[:queue_connection_factory]
|
86
|
+
end
|
87
|
+
|
88
|
+
def topic_connection_factory
|
89
|
+
@connection_factories[:topic_connection_factory]
|
90
|
+
end
|
91
|
+
|
92
|
+
def enable_queues(jndi_names={})
|
93
|
+
jndi_names.each do |key, jndi_name|
|
94
|
+
@queues[key] = @jndi_context.lookup(jndi_name)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def queue_enabled?(queue_name)
|
99
|
+
@queues.include?(queue_name)
|
100
|
+
end
|
101
|
+
|
102
|
+
def queue(queue_name)
|
103
|
+
raise NameError, "Queue '#{queue_name}' does not exist." unless queue_enabled?(queue_name)
|
104
|
+
|
105
|
+
@queues[queue_name]
|
106
|
+
end
|
107
|
+
|
108
|
+
def queue_sender(queue_name)
|
109
|
+
@queue_senders[queue_name] ||=
|
110
|
+
Messaging::Sender.new(queue_connection_factory, queue(queue_name))
|
111
|
+
end
|
112
|
+
|
113
|
+
def queue_receiver(queue_name)
|
114
|
+
@queue_receivers[queue_name] ||=
|
115
|
+
Messaging::Receiver.new(queue_connection_factory, queue(queue_name))
|
116
|
+
end
|
117
|
+
|
118
|
+
def enable_topics(jndi_names={})
|
119
|
+
jndi_names.each do |key, jndi_name|
|
120
|
+
@topics[key] = @jndi_context.lookup(jndi_name)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def topic_enabled?(topic_name)
|
125
|
+
@topics.include?(topic_name)
|
126
|
+
end
|
127
|
+
|
128
|
+
def topic(topic_name)
|
129
|
+
raise NameError, "Topic '#{topic_name}' does not exist." unless topic_enabled?(topic_name)
|
130
|
+
|
131
|
+
@topics[topic_name]
|
132
|
+
end
|
133
|
+
|
134
|
+
def topic_sender(topic_name)
|
135
|
+
@topic_senders[topic_name] ||=
|
136
|
+
Messaging::Sender.new(topic_connection_factory, topic(topic_name))
|
137
|
+
end
|
138
|
+
|
139
|
+
def topic_receiver(topic_name)
|
140
|
+
@topic_receivers[topic_name] ||=
|
141
|
+
Messaging::Receiver.new(topic_connection_factory, topic(topic_name))
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
class ClientInitializationError < StandardError
|
146
|
+
attr_reader :properties, :cause
|
147
|
+
|
148
|
+
def initialize(properties, cause)
|
149
|
+
super("Could not open connection to the server. Verify the properties's properties.")
|
150
|
+
|
151
|
+
@properties = properties
|
152
|
+
@cause = cause
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
Binary file
|
data/lib/jee/jms.jar
ADDED
Binary file
|
Binary file
|
data/lib/jee.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# Defini��o do diret�rios onde est�o as libs
|
2
|
+
JEE_LIB_DIR = File.expand_path(File.dirname(__FILE__)) + '/jee'
|
3
|
+
|
4
|
+
# Antes de qualquer outra, a fundamental
|
5
|
+
require 'java'
|
6
|
+
|
7
|
+
# Biblioteca essencial de integra��o com JMS
|
8
|
+
require "#{JEE_LIB_DIR}/sparrow-essential.jar"
|
9
|
+
|
10
|
+
# Biblioteca Java EE principal
|
11
|
+
require "#{JEE_LIB_DIR}/javaee-1.5.jar"
|
12
|
+
|
13
|
+
# Biblioteca da API JMS
|
14
|
+
require "#{JEE_LIB_DIR}/jms.jar"
|
data/lib/messaging.rb
ADDED
@@ -0,0 +1,230 @@
|
|
1
|
+
# Classes java usadas nesse arquivo
|
2
|
+
import 'javax.jms.Session'
|
3
|
+
import 'javax.jms.MessageListener'
|
4
|
+
|
5
|
+
module Sparrow
|
6
|
+
module JMS
|
7
|
+
module Messaging
|
8
|
+
|
9
|
+
#
|
10
|
+
# Tempo padr�o de timeout no recebimento de mensagens = 1 milesegundo.
|
11
|
+
#
|
12
|
+
DEFAULT_RECEIVER_TIMEOUT = 1000
|
13
|
+
|
14
|
+
#
|
15
|
+
# Classe base para mensageiros, que enviam ou recebem mensagens, tanto
|
16
|
+
# para filas ou t�picos.
|
17
|
+
#
|
18
|
+
class Base
|
19
|
+
def initialize(connection_factory, destination)
|
20
|
+
# F�brica de conex�es JMS
|
21
|
+
@connection_factory = connection_factory
|
22
|
+
|
23
|
+
# Destino JMS para envio ou recebimento de mensagens
|
24
|
+
@destination = destination
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# Emissor de mensagens.
|
30
|
+
#
|
31
|
+
class Sender < Base
|
32
|
+
def send_text_message(text)
|
33
|
+
send_message do |session|
|
34
|
+
text_message = session.create_text_message(text)
|
35
|
+
|
36
|
+
# Se houver uma bloco para tratamento da mensagem
|
37
|
+
if block_given?
|
38
|
+
yield(text_message)
|
39
|
+
end
|
40
|
+
|
41
|
+
text_message
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def send_object_message(object)
|
46
|
+
send_message do |session|
|
47
|
+
object_message = session.create_object_message(object)
|
48
|
+
|
49
|
+
# Se houver uma bloco para tratamento da mensagem
|
50
|
+
if block_given?
|
51
|
+
yield(object_message)
|
52
|
+
end
|
53
|
+
|
54
|
+
object_message
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def send_map_message
|
59
|
+
send_message do |session|
|
60
|
+
map_message = session.create_map_message
|
61
|
+
|
62
|
+
# Se houver uma bloco para tratamento da mensagem
|
63
|
+
if block_given?
|
64
|
+
yield(map_message)
|
65
|
+
end
|
66
|
+
|
67
|
+
map_message
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def send_messages(&message_sender)
|
72
|
+
# Cria uma conex�o, uma sess�o e um emissor de qualquer tipo de mensagem
|
73
|
+
connection = @connection_factory.create_connection
|
74
|
+
session = connection.create_session(true, Session::AUTO_ACKNOWLEDGE)
|
75
|
+
producer = session.create_producer(@destination)
|
76
|
+
|
77
|
+
# Passa o controle que trata a emiss�o de mensagens
|
78
|
+
message_sender.call(session, producer)
|
79
|
+
|
80
|
+
# Fecha a conex�o
|
81
|
+
connection.close
|
82
|
+
end
|
83
|
+
|
84
|
+
# --- Private methods --- #
|
85
|
+
private
|
86
|
+
|
87
|
+
def send_message(&message_creator)
|
88
|
+
# Cria uma conex�o, uma sess�o e um emissor de qualquer tipo de mensagem
|
89
|
+
connection = @connection_factory.create_connection
|
90
|
+
session = connection.create_session(true, Session::AUTO_ACKNOWLEDGE)
|
91
|
+
producer = session.create_producer(@destination)
|
92
|
+
|
93
|
+
# Obtem uma mensagem (TextMessage, ObjectMessage ou MapMessage) do criador especifico
|
94
|
+
message = message_creator.call(session)
|
95
|
+
|
96
|
+
# Envia a mensagem
|
97
|
+
producer.send(message)
|
98
|
+
|
99
|
+
# Commita a sess�o e fecha a conex�o
|
100
|
+
session.commit
|
101
|
+
connection.close
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
#
|
106
|
+
# Receptor de mensagens.
|
107
|
+
#
|
108
|
+
class Receiver < Base
|
109
|
+
def receive_message(criteria_for_receiving = {:timeout => DEFAULT_RECEIVER_TIMEOUT, :selector => ''}, &message_handler)
|
110
|
+
# Cria uma conex�o, uma sess�o e um consumidor de qualquer tipo de mensagem
|
111
|
+
connection = @connection_factory.create_connection
|
112
|
+
session = connection.create_session(false, Session::AUTO_ACKNOWLEDGE)
|
113
|
+
consumer = session.create_consumer(@destination, criteria_for_receiving[:selector])
|
114
|
+
|
115
|
+
# Prepara a conex�o para receber mensagens
|
116
|
+
connection.start
|
117
|
+
|
118
|
+
# Inicia o recebimento de mensagens
|
119
|
+
timeout = criteria_for_receiving[:timeout] || DEFAULT_RECEIVER_TIMEOUT
|
120
|
+
|
121
|
+
while (received_message = consumer.receive(timeout))
|
122
|
+
# Inclui o modulo de identifica��o de mensagem, util para o message_handler
|
123
|
+
class << received_message
|
124
|
+
include MessageType
|
125
|
+
end
|
126
|
+
|
127
|
+
# Delega o tratamento da mensagem para o bloco recebido
|
128
|
+
message_handler.call(received_message)
|
129
|
+
end
|
130
|
+
|
131
|
+
# Fecha a conex�o
|
132
|
+
connection.close
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
#
|
137
|
+
# Ouvintes de mensagens.
|
138
|
+
#
|
139
|
+
# TODO: Completar a implementa��o. Ainda n�o est� legal.
|
140
|
+
#
|
141
|
+
class Listener < Base
|
142
|
+
include MessageListener
|
143
|
+
|
144
|
+
def initialize(connection_factory, destination)
|
145
|
+
super(connection_factory, destination)
|
146
|
+
end
|
147
|
+
|
148
|
+
def criteria_for_receiving(criteria = {:timeout => DEFAULT_RECEIVER_TIMEOUT, :selector => ''})
|
149
|
+
# Valor default para timeout, caso n�o tenha sido informado
|
150
|
+
@criteria_for_receiving[:timeout] = criteria[:timeout] || DEFAULT_RECEIVER_TIMEOUT
|
151
|
+
end
|
152
|
+
|
153
|
+
#
|
154
|
+
# Nome pelo qual este listener ser� conhecido.
|
155
|
+
#
|
156
|
+
# Invariavelmente deve ser re-implementado nas subclasses.
|
157
|
+
#
|
158
|
+
def name
|
159
|
+
raise Utils::Exception::AbstractMethodError.new('name')
|
160
|
+
end
|
161
|
+
|
162
|
+
#
|
163
|
+
# Destino JMS que ser� escutado.
|
164
|
+
#
|
165
|
+
# Invariavelmente deve ser re-implementado nas subclasses.
|
166
|
+
#
|
167
|
+
def destination_name
|
168
|
+
raise Utils::Exception::AbstractMethodError.new('destination_name')
|
169
|
+
end
|
170
|
+
|
171
|
+
#
|
172
|
+
# Inicia a escuta de mensagens.
|
173
|
+
#
|
174
|
+
def start_listening
|
175
|
+
# Cria uma conex�o, uma sess�o e um consumidor de qualquer tipo de mensagem
|
176
|
+
connection = @connection_factory.create_connection
|
177
|
+
session = connection.create_session(false, Session::AUTO_ACKNOWLEDGE)
|
178
|
+
consumer = session.create_consumer(@destination, @criteria_for_receiving[:selector])
|
179
|
+
|
180
|
+
# Registra-se como ouvinte
|
181
|
+
consumer.message_listener = self
|
182
|
+
|
183
|
+
# inicia a escuta de mensagens
|
184
|
+
connection.start
|
185
|
+
end
|
186
|
+
|
187
|
+
#
|
188
|
+
# Faz o enriquecimento do objeto mensagem e delega para o m�todo on_receive_message
|
189
|
+
# que, implementado pelas subclasses, efetivamente trata a mensagem.
|
190
|
+
#
|
191
|
+
# N�o deve ser re-implementado por subclasses.
|
192
|
+
#
|
193
|
+
def on_message(received_message)
|
194
|
+
class << received_message
|
195
|
+
include MessageType
|
196
|
+
end
|
197
|
+
|
198
|
+
on_receive_message(received_message)
|
199
|
+
end
|
200
|
+
|
201
|
+
#
|
202
|
+
# � executado todas as vezes que chega uma mensagem que atenda aos crit�rios
|
203
|
+
# definido para este listener (na vari�vel de inst�ncia @criteria).
|
204
|
+
#
|
205
|
+
# Invariavelmente deve ser re-implementado nas subclasses.
|
206
|
+
#
|
207
|
+
def on_receive_message(received_message)
|
208
|
+
raise Utils::Exception::AbstractMethodError.new('on_receive_message')
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
#
|
214
|
+
# Identifica o tipo de uma mensagem.
|
215
|
+
#
|
216
|
+
module MessageType
|
217
|
+
def is_text_message?
|
218
|
+
respond_to? :get_text
|
219
|
+
end
|
220
|
+
|
221
|
+
def is_object_message?
|
222
|
+
(respond_to? :get_object and !(respond_to? :get_long))
|
223
|
+
end
|
224
|
+
|
225
|
+
def is_map_message?
|
226
|
+
respond_to? :get_long
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
data/lib/sparrow.rb
ADDED
data/lib/utils.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
module Sparrow
|
2
|
+
module Utils
|
3
|
+
module Exception
|
4
|
+
class AbstractMethodError < StandardError
|
5
|
+
def initialize(method_name)
|
6
|
+
super("The '#{self.class}##{method_name}' is a abstract method. Definition is a subclass responsibility.")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require File.dirname(File.expand_path(__FILE__)) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
#
|
4
|
+
# Cen�rio de configura��o do cliente JMS, quando s�o informadas as propriedades de ambiente
|
5
|
+
# para conex�o com o servidor de aplica��es e a inicializa��o do contexto JNDI inicial,
|
6
|
+
# onde est�o criadas as connection factories, queues e topics.
|
7
|
+
#
|
8
|
+
describe Sparrow::JMS::Connection::Client, ', quando esta sendo configurado,' do
|
9
|
+
|
10
|
+
before(:all) do
|
11
|
+
@jms_client = create_jms_client
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'deveria permitir habilitar uma connection factory especifica para queues' do
|
15
|
+
@jms_client.enable_connection_factories(
|
16
|
+
:queue_connection_factory => 'jms/PardalQCF'
|
17
|
+
)
|
18
|
+
|
19
|
+
@jms_client.queue_connection_factory.should_not be nil
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'deveria permitir habilitar uma connection factory especifica para topics' do
|
23
|
+
@jms_client.enable_connection_factories(
|
24
|
+
:topic_connection_factory => 'jms/PardalTCF'
|
25
|
+
)
|
26
|
+
|
27
|
+
@jms_client.topic_connection_factory.should_not be nil
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'deveria permitir habilitar uma Queue especifica' do
|
31
|
+
@jms_client.enable_queues(
|
32
|
+
:pardal_queue => 'jms/PardalQueue'
|
33
|
+
)
|
34
|
+
|
35
|
+
@jms_client.queue_enabled?(:pardal_queue).should eql true
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'deveria permitir habilitar um Topic especifico' do
|
39
|
+
@jms_client.enable_topics(
|
40
|
+
:pardal_topic => 'jms/PardalTopic'
|
41
|
+
)
|
42
|
+
|
43
|
+
@jms_client.topic_enabled?(:pardal_topic).should eql true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# Cen�rio p�s-configura��o do cliente JMS, quando as queues e os t�picos j� devem estar
|
49
|
+
# dispon�veis, e ent�o � poss�vel obter sender/receiver para elas.
|
50
|
+
#
|
51
|
+
describe Sparrow::JMS::Connection::Client, ', depois de ter sido configurado,' do
|
52
|
+
|
53
|
+
before(:all) do
|
54
|
+
@jms_client = create_and_setup_jms_client
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'deveria possibilitar obter um Sender para uma Queue especifica' do
|
58
|
+
@jms_client.queue_sender(:pardal_queue).should_not be nil
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'deveria possibilitar obter um Receiver para uma Queue especifica' do
|
62
|
+
@jms_client.queue_receiver(:pardal_queue).should_not be nil
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'deveria possibilitar obter um Sender para um Topic especifico' do
|
66
|
+
@jms_client.topic_sender(:pardal_topic).should_not be nil
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'deveria possibilitar obter um Receiver para um Topic especifico' do
|
70
|
+
@jms_client.topic_receiver(:pardal_topic).should_not be nil
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require File.dirname(File.expand_path(__FILE__)) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
#
|
4
|
+
# Cen�rio p�s-obten��o de um Sender e um Receiver, quando deve ser poss�vel enviar e
|
5
|
+
# receber mensagens de tr�s tipos (Texto, Objeto e Mapa) de uma queue especifica,
|
6
|
+
# individualmente ou em lote.
|
7
|
+
#
|
8
|
+
describe Sparrow::JMS::Messaging, ', quando tem um Sender e um Receiver para uma Queue especifica,' do
|
9
|
+
|
10
|
+
before(:all) do
|
11
|
+
jms_client = create_and_setup_jms_client
|
12
|
+
|
13
|
+
@sender = jms_client.queue_sender(:pardal_queue)
|
14
|
+
@receiver = jms_client.queue_receiver(:pardal_queue)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'deveria possibilitar enviar uma mensagem de texto e recebe-la' do
|
18
|
+
my_text = 'Mensagem de texto enviada da spec'
|
19
|
+
|
20
|
+
@sender.send_text_message(my_text) do |msg|
|
21
|
+
msg.set_string_property('recipient', 'sparrow-spec')
|
22
|
+
end
|
23
|
+
|
24
|
+
received_text = nil
|
25
|
+
|
26
|
+
@receiver.receive_message(:selector => "recipient = 'sparrow-spec'") do |msg|
|
27
|
+
received_text = msg.text
|
28
|
+
end
|
29
|
+
|
30
|
+
received_text.should eql my_text
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'deveria possibilitar enviar um objeto e recebe-lo' do
|
34
|
+
my_object = java.util.ArrayList.new
|
35
|
+
my_object << 'Obj1 enviado da spec'
|
36
|
+
|
37
|
+
@sender.send_object_message(my_object) do |msg|
|
38
|
+
msg.set_string_property('recipient', 'sparrow-spec')
|
39
|
+
end
|
40
|
+
|
41
|
+
received_object = nil
|
42
|
+
|
43
|
+
@receiver.receive_message(:selector => "recipient = 'sparrow-spec'") do |msg|
|
44
|
+
received_object = msg.object
|
45
|
+
end
|
46
|
+
|
47
|
+
received_object.should eql my_object
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'deveria possibilitar enviar uma mensagem mapa e recebe-la' do
|
51
|
+
my_id_long = 1234567
|
52
|
+
|
53
|
+
@sender.send_map_message do |msg|
|
54
|
+
msg.set_string_property('recipient', 'sparrow-spec')
|
55
|
+
msg.set_long('id', my_id_long)
|
56
|
+
end
|
57
|
+
|
58
|
+
received_id_long = nil
|
59
|
+
|
60
|
+
@receiver.receive_message(:selector => "recipient = 'sparrow-spec'") do |msg|
|
61
|
+
received_id_long = msg.get_long('id')
|
62
|
+
end
|
63
|
+
|
64
|
+
received_id_long.should eql my_id_long
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'deveria possibilitar enviar varias mensagens de qualquer tipo e recebe-las' do
|
68
|
+
my_text = 'Mensagem de texto enviada da spec'
|
69
|
+
|
70
|
+
my_object = java.util.ArrayList.new
|
71
|
+
my_object << 'Obj1 enviado da spec'
|
72
|
+
|
73
|
+
my_id_long = 1234567
|
74
|
+
|
75
|
+
@sender.send_messages do |session, producer|
|
76
|
+
#--- TextMessage
|
77
|
+
text_message = session.create_text_message(my_text)
|
78
|
+
text_message.set_string_property('recipient', 'sparrow-spec')
|
79
|
+
producer.send(text_message)
|
80
|
+
|
81
|
+
#--- objectMessage
|
82
|
+
object_message = session.create_object_message(my_object)
|
83
|
+
object_message.set_string_property('recipient', 'sparrow-spec')
|
84
|
+
producer.send(object_message)
|
85
|
+
|
86
|
+
#--- MapMessage
|
87
|
+
map_message = session.create_map_message
|
88
|
+
map_message.set_string_property('recipient', 'sparrow-spec')
|
89
|
+
map_message.set_long('id', my_id_long)
|
90
|
+
producer.send(map_message)
|
91
|
+
|
92
|
+
# Commita as tr�s mensagens enviadas na sess�o
|
93
|
+
session.commit
|
94
|
+
end
|
95
|
+
|
96
|
+
received_text = nil
|
97
|
+
received_object = nil
|
98
|
+
received_id_long = nil
|
99
|
+
|
100
|
+
@receiver.receive_message(:timeout => 1000, :selector => "recipient = 'sparrow-spec'") do |msg|
|
101
|
+
if msg.is_text_message?
|
102
|
+
received_text = msg.text
|
103
|
+
end
|
104
|
+
|
105
|
+
if msg.is_object_message?
|
106
|
+
received_object = msg.object
|
107
|
+
end
|
108
|
+
|
109
|
+
if msg.is_map_message?
|
110
|
+
received_id_long = msg.get_long('id')
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
received_text.should eql my_text
|
115
|
+
received_object.should eql my_object
|
116
|
+
received_id_long.should eql my_id_long
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
#
|
121
|
+
# Cen�rio p�s-configura��o do cliente JMS, quando deve ser poss�vel escutar mensagens
|
122
|
+
# atrav�s de objetos listeners.
|
123
|
+
#
|
124
|
+
describe Sparrow::JMS::Messaging::Listener,
|
125
|
+
', quando um Listener se registra para escutar uma Queue especifica,' do
|
126
|
+
|
127
|
+
before(:all) do
|
128
|
+
jms_client = create_and_setup_jms_client
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'deveria possibilitar escutar mensagens atraves de um listener'
|
132
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec'
|
3
|
+
|
4
|
+
require File.dirname(File.expand_path(__FILE__)) + '/../lib/sparrow.rb'
|
5
|
+
|
6
|
+
#
|
7
|
+
# M�dulo com m�todos uteis para as propertiess.
|
8
|
+
#
|
9
|
+
module SparrowHelperMethods
|
10
|
+
|
11
|
+
#
|
12
|
+
# Apenas cria, mas n�o faz o setup do cliente JMS.
|
13
|
+
#
|
14
|
+
def create_jms_client
|
15
|
+
jms_client = Sparrow::JMS::Connection::Client.new do |properties|
|
16
|
+
properties.client_jar_file = '/home/leandro/Desenvolvimento/java/servers/oc4j_extended_101330/j2ee/home/oc4jclient.jar'
|
17
|
+
properties.initial_context_factory = 'oracle.j2ee.naming.ApplicationClientInitialContextFactory'
|
18
|
+
properties.provider_url = 'ormi://localhost:23791'
|
19
|
+
properties.security_principal = 'oc4jadmin'
|
20
|
+
properties.security_credentials = 'welcome'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# Cria e faz o setup do cliente JMS, habilitando os connection factories, queues e topics
|
26
|
+
# que ele pode usar.
|
27
|
+
#
|
28
|
+
def create_and_setup_jms_client
|
29
|
+
jms_client = create_jms_client
|
30
|
+
|
31
|
+
jms_client.enable_connection_factories(
|
32
|
+
:queue_connection_factory => 'jms/PardalQCF',
|
33
|
+
:topic_connection_factory => 'jms/PardalTCF'
|
34
|
+
)
|
35
|
+
|
36
|
+
jms_client.enable_queues(
|
37
|
+
:pardal_queue => 'jms/PardalQueue'
|
38
|
+
)
|
39
|
+
|
40
|
+
jms_client.enable_topics(
|
41
|
+
:pardal_topic => 'jms/PardalTopic'
|
42
|
+
)
|
43
|
+
|
44
|
+
# Pronto para ser usado!
|
45
|
+
jms_client
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Enriquece a classe Spec::Example::ExampleGroup com o helper.
|
51
|
+
#
|
52
|
+
class Spec::Example::ExampleGroup
|
53
|
+
include SparrowHelperMethods
|
54
|
+
end
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: leandrosilva-sparrow
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Leandro Silva
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-03-07 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: leandrodoze@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README.rdoc
|
24
|
+
- LICENSE
|
25
|
+
files:
|
26
|
+
- LICENSE
|
27
|
+
- VERSION.yml
|
28
|
+
- README.rdoc
|
29
|
+
- Rakefile
|
30
|
+
- lib/jee.rb
|
31
|
+
- lib/utils.rb
|
32
|
+
- lib/sparrow.rb
|
33
|
+
- lib/messaging.rb
|
34
|
+
- lib/connection.rb
|
35
|
+
- lib/jee
|
36
|
+
- lib/jee/sparrow-essential.jar
|
37
|
+
- lib/jee/jms.jar
|
38
|
+
- lib/jee/javaee-1.5.jar
|
39
|
+
- spec/spec_helper.rb
|
40
|
+
- spec/messaging_spec.rb
|
41
|
+
- spec/connection_spec.rb
|
42
|
+
has_rdoc: true
|
43
|
+
homepage: http://github.com/leandrosilva/sparrow
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options:
|
46
|
+
- --inline-source
|
47
|
+
- --charset=UTF-8
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: "0"
|
55
|
+
version:
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: "0"
|
61
|
+
version:
|
62
|
+
requirements: []
|
63
|
+
|
64
|
+
rubyforge_project:
|
65
|
+
rubygems_version: 1.2.0
|
66
|
+
signing_key:
|
67
|
+
specification_version: 2
|
68
|
+
summary: Sparrow is a JMS client (JRuby based)
|
69
|
+
test_files: []
|
70
|
+
|