leandrosilva-sparrow 1.0.0 → 1.0.1
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/README.rdoc +60 -0
- data/VERSION.yml +1 -1
- data/lib/connection.rb +8 -8
- data/lib/jee.rb +6 -6
- data/lib/messaging.rb +24 -27
- data/lib/sparrow.rb +1 -1
- data/spec/connection_spec.rb +5 -5
- data/spec/messaging_spec.rb +6 -6
- data/spec/spec_helper.rb +5 -2
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -2,6 +2,66 @@
|
|
2
2
|
|
3
3
|
Sparrow is a JMS client (JRuby based).
|
4
4
|
|
5
|
+
=== Install
|
6
|
+
|
7
|
+
Add Github as a source for your RubyGem:
|
8
|
+
|
9
|
+
gem sources -a http://gems.github.com
|
10
|
+
|
11
|
+
Make install:
|
12
|
+
|
13
|
+
sudo gem install leandrosilva-sparrow
|
14
|
+
|
15
|
+
=== Example
|
16
|
+
|
17
|
+
===== Three steps to send and receive JMS messages to/from a Java EE application server.
|
18
|
+
|
19
|
+
WARNING: OC4J will be used as Java EE application server, but any other could be used with no problems.
|
20
|
+
|
21
|
+
1) Create my_sparrow_test.rb file and require the gems
|
22
|
+
|
23
|
+
require 'rubygems'
|
24
|
+
require 'sparrow'
|
25
|
+
|
26
|
+
2) Create and setup a sparrow JMS client
|
27
|
+
|
28
|
+
jms_client = Sparrow::JMS::Connection::Client.new do |properties|
|
29
|
+
properties.client_jar_file = '/oc4j_extended_101330/j2ee/home/oc4jclient.jar'
|
30
|
+
properties.initial_context_factory = 'oracle.j2ee.naming.ApplicationClientInitialContextFactory'
|
31
|
+
properties.provider_url = 'ormi://localhost:23791'
|
32
|
+
properties.security_principal = 'oc4jadmin'
|
33
|
+
properties.security_credentials = 'welcome'
|
34
|
+
end
|
35
|
+
|
36
|
+
jms_client.enable_connection_factories(
|
37
|
+
:queue_connection_factory => 'jms/MyQueueCF'
|
38
|
+
)
|
39
|
+
|
40
|
+
jms_client.enable_queues(
|
41
|
+
:my_queue => 'jms/MyQueue'
|
42
|
+
)
|
43
|
+
|
44
|
+
3) OK! You can send and receive messages right now!
|
45
|
+
|
46
|
+
jms_client.queue_sender(:my_queue).send_text_message('sparrow rocks!') do |msg|
|
47
|
+
msg.set_string_property('recipient', 'sparrow-example')
|
48
|
+
end
|
49
|
+
|
50
|
+
jms_client.queue_receiver(:my_queue).receive_message(
|
51
|
+
:timeout => 5000,
|
52
|
+
:selector => "recipient = 'sparrow-example'"
|
53
|
+
) do |msg|
|
54
|
+
|
55
|
+
puts msg.is_text_message? # true
|
56
|
+
puts msg.text # sparrow rocks!
|
57
|
+
end
|
58
|
+
|
59
|
+
So, now start the OC4J server, create the connection factory (jms/MyQueueCF) and queue (jms/MyQueue), and run above script:
|
60
|
+
|
61
|
+
jruby my_sparrow_test.rb
|
62
|
+
|
63
|
+
sparrow rocks! =)
|
64
|
+
|
5
65
|
== Copyright
|
6
66
|
|
7
67
|
Copyright (c) 2009 Leandro Silva. See LICENSE for details.
|
data/VERSION.yml
CHANGED
data/lib/connection.rb
CHANGED
@@ -7,8 +7,8 @@ module Sparrow
|
|
7
7
|
module Connection
|
8
8
|
|
9
9
|
#
|
10
|
-
#
|
11
|
-
# ao servidor de
|
10
|
+
# Configuracoes necessarias para que clientes JMS se conectem
|
11
|
+
# ao servidor de aplicacoes Java EE via JNDI Context.
|
12
12
|
#
|
13
13
|
class Properties
|
14
14
|
attr_accessor :client_jar_file,
|
@@ -16,7 +16,7 @@ module Sparrow
|
|
16
16
|
:security_principal, :security_credentials
|
17
17
|
|
18
18
|
#
|
19
|
-
# Cria um Hashtable Java contendo as
|
19
|
+
# Cria um Hashtable Java contendo as configuracoes atuais.
|
20
20
|
#
|
21
21
|
def to_jndi_environment_hashtable
|
22
22
|
jndi_env = Hashtable.new
|
@@ -37,10 +37,10 @@ module Sparrow
|
|
37
37
|
end
|
38
38
|
|
39
39
|
#
|
40
|
-
# Constroi um contexto JNDI inicial a partir das
|
40
|
+
# Constroi um contexto JNDI inicial a partir das configuracoes atuais.
|
41
41
|
#
|
42
42
|
def build_jndi_context
|
43
|
-
# Carrega a biblioteca cliente do servidor de
|
43
|
+
# Carrega a biblioteca cliente do servidor de aplicacoes
|
44
44
|
require @client_jar_file
|
45
45
|
|
46
46
|
InitialContext.new(to_jndi_environment_hashtable)
|
@@ -48,8 +48,8 @@ module Sparrow
|
|
48
48
|
end
|
49
49
|
|
50
50
|
#
|
51
|
-
# Cliente JMS que possibilita a
|
52
|
-
# que
|
51
|
+
# Cliente JMS que possibilita a conexao com o servidor de aplicacoes Java EE
|
52
|
+
# que prove o servico JMS.
|
53
53
|
#
|
54
54
|
class Client
|
55
55
|
attr_reader :properties
|
@@ -65,7 +65,7 @@ module Sparrow
|
|
65
65
|
raise ClientInitializationError.new(@properties, cause)
|
66
66
|
end
|
67
67
|
|
68
|
-
#
|
68
|
+
# Conexoes, filas, topicos, senders e receivers que serao habilitados
|
69
69
|
@connection_factories = {}
|
70
70
|
@queues = {}
|
71
71
|
@queue_senders = {}
|
data/lib/jee.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
#
|
1
|
+
# Libs directory definition
|
2
2
|
JEE_LIB_DIR = File.expand_path(File.dirname(__FILE__)) + '/jee'
|
3
3
|
|
4
|
-
#
|
4
|
+
# Befor all, the fundamental require for us
|
5
5
|
require 'java'
|
6
6
|
|
7
|
-
#
|
7
|
+
# Lib to JMS integration (contain the META-INF/applicationContext.xml)
|
8
8
|
require "#{JEE_LIB_DIR}/sparrow-essential.jar"
|
9
9
|
|
10
|
-
#
|
10
|
+
# Java EE
|
11
11
|
require "#{JEE_LIB_DIR}/javaee-1.5.jar"
|
12
12
|
|
13
|
-
#
|
14
|
-
require "#{JEE_LIB_DIR}/jms.jar"
|
13
|
+
# JMS API
|
14
|
+
require "#{JEE_LIB_DIR}/jms.jar"
|
data/lib/messaging.rb
CHANGED
@@ -3,21 +3,21 @@ import 'javax.jms.Session'
|
|
3
3
|
import 'javax.jms.MessageListener'
|
4
4
|
|
5
5
|
module Sparrow
|
6
|
-
module
|
6
|
+
module JMSg
|
7
7
|
module Messaging
|
8
8
|
|
9
9
|
#
|
10
|
-
# Tempo
|
10
|
+
# Tempo padrao de timeout no recebimento de mensagens = 1 milesegundo.
|
11
11
|
#
|
12
12
|
DEFAULT_RECEIVER_TIMEOUT = 1000
|
13
13
|
|
14
14
|
#
|
15
15
|
# Classe base para mensageiros, que enviam ou recebem mensagens, tanto
|
16
|
-
# para filas ou
|
16
|
+
# para filas ou topicos.
|
17
17
|
#
|
18
18
|
class Base
|
19
19
|
def initialize(connection_factory, destination)
|
20
|
-
#
|
20
|
+
# Fabrica de conexoes JMS
|
21
21
|
@connection_factory = connection_factory
|
22
22
|
|
23
23
|
# Destino JMS para envio ou recebimento de mensagens
|
@@ -33,7 +33,6 @@ module Sparrow
|
|
33
33
|
send_message do |session|
|
34
34
|
text_message = session.create_text_message(text)
|
35
35
|
|
36
|
-
# Se houver uma bloco para tratamento da mensagem
|
37
36
|
if block_given?
|
38
37
|
yield(text_message)
|
39
38
|
end
|
@@ -46,7 +45,6 @@ module Sparrow
|
|
46
45
|
send_message do |session|
|
47
46
|
object_message = session.create_object_message(object)
|
48
47
|
|
49
|
-
# Se houver uma bloco para tratamento da mensagem
|
50
48
|
if block_given?
|
51
49
|
yield(object_message)
|
52
50
|
end
|
@@ -59,7 +57,6 @@ module Sparrow
|
|
59
57
|
send_message do |session|
|
60
58
|
map_message = session.create_map_message
|
61
59
|
|
62
|
-
# Se houver uma bloco para tratamento da mensagem
|
63
60
|
if block_given?
|
64
61
|
yield(map_message)
|
65
62
|
end
|
@@ -69,15 +66,15 @@ module Sparrow
|
|
69
66
|
end
|
70
67
|
|
71
68
|
def send_messages(&message_sender)
|
72
|
-
# Cria uma
|
69
|
+
# Cria uma conexao, uma sessao e um emissor de qualquer tipo de mensagem
|
73
70
|
connection = @connection_factory.create_connection
|
74
71
|
session = connection.create_session(true, Session::AUTO_ACKNOWLEDGE)
|
75
72
|
producer = session.create_producer(@destination)
|
76
73
|
|
77
|
-
# Passa o controle que trata a
|
74
|
+
# Passa o controle que trata a emissao de mensagens
|
78
75
|
message_sender.call(session, producer)
|
79
76
|
|
80
|
-
# Fecha a
|
77
|
+
# Fecha a conexao
|
81
78
|
connection.close
|
82
79
|
end
|
83
80
|
|
@@ -85,7 +82,7 @@ module Sparrow
|
|
85
82
|
private
|
86
83
|
|
87
84
|
def send_message(&message_creator)
|
88
|
-
# Cria uma
|
85
|
+
# Cria uma conexao, uma sessao e um emissor de qualquer tipo de mensagem
|
89
86
|
connection = @connection_factory.create_connection
|
90
87
|
session = connection.create_session(true, Session::AUTO_ACKNOWLEDGE)
|
91
88
|
producer = session.create_producer(@destination)
|
@@ -96,7 +93,7 @@ module Sparrow
|
|
96
93
|
# Envia a mensagem
|
97
94
|
producer.send(message)
|
98
95
|
|
99
|
-
# Commita a
|
96
|
+
# Commita a sessao e fecha a conexao
|
100
97
|
session.commit
|
101
98
|
connection.close
|
102
99
|
end
|
@@ -107,19 +104,19 @@ module Sparrow
|
|
107
104
|
#
|
108
105
|
class Receiver < Base
|
109
106
|
def receive_message(criteria_for_receiving = {:timeout => DEFAULT_RECEIVER_TIMEOUT, :selector => ''}, &message_handler)
|
110
|
-
# Cria uma
|
107
|
+
# Cria uma conexao, uma sessao e um consumidor de qualquer tipo de mensagem
|
111
108
|
connection = @connection_factory.create_connection
|
112
109
|
session = connection.create_session(false, Session::AUTO_ACKNOWLEDGE)
|
113
110
|
consumer = session.create_consumer(@destination, criteria_for_receiving[:selector])
|
114
111
|
|
115
|
-
# Prepara a
|
112
|
+
# Prepara a conexao para receber mensagens
|
116
113
|
connection.start
|
117
114
|
|
118
115
|
# Inicia o recebimento de mensagens
|
119
116
|
timeout = criteria_for_receiving[:timeout] || DEFAULT_RECEIVER_TIMEOUT
|
120
117
|
|
121
118
|
while (received_message = consumer.receive(timeout))
|
122
|
-
# Inclui o modulo de
|
119
|
+
# Inclui o modulo de identificacao de mensagem, util para o message_handler
|
123
120
|
class << received_message
|
124
121
|
include MessageType
|
125
122
|
end
|
@@ -128,7 +125,7 @@ module Sparrow
|
|
128
125
|
message_handler.call(received_message)
|
129
126
|
end
|
130
127
|
|
131
|
-
# Fecha a
|
128
|
+
# Fecha a conexao
|
132
129
|
connection.close
|
133
130
|
end
|
134
131
|
end
|
@@ -136,7 +133,7 @@ module Sparrow
|
|
136
133
|
#
|
137
134
|
# Ouvintes de mensagens.
|
138
135
|
#
|
139
|
-
# TODO: Completar a
|
136
|
+
# TODO: Completar a implementacao. Ainda nao esta legal.
|
140
137
|
#
|
141
138
|
class Listener < Base
|
142
139
|
include MessageListener
|
@@ -146,12 +143,12 @@ module Sparrow
|
|
146
143
|
end
|
147
144
|
|
148
145
|
def criteria_for_receiving(criteria = {:timeout => DEFAULT_RECEIVER_TIMEOUT, :selector => ''})
|
149
|
-
# Valor default para timeout, caso
|
146
|
+
# Valor default para timeout, caso nao tenha sido informado
|
150
147
|
@criteria_for_receiving[:timeout] = criteria[:timeout] || DEFAULT_RECEIVER_TIMEOUT
|
151
148
|
end
|
152
149
|
|
153
150
|
#
|
154
|
-
# Nome pelo qual este listener
|
151
|
+
# Nome pelo qual este listener sera conhecido.
|
155
152
|
#
|
156
153
|
# Invariavelmente deve ser re-implementado nas subclasses.
|
157
154
|
#
|
@@ -160,7 +157,7 @@ module Sparrow
|
|
160
157
|
end
|
161
158
|
|
162
159
|
#
|
163
|
-
# Destino JMS que
|
160
|
+
# Destino JMS que sera escutado.
|
164
161
|
#
|
165
162
|
# Invariavelmente deve ser re-implementado nas subclasses.
|
166
163
|
#
|
@@ -172,7 +169,7 @@ module Sparrow
|
|
172
169
|
# Inicia a escuta de mensagens.
|
173
170
|
#
|
174
171
|
def start_listening
|
175
|
-
# Cria uma
|
172
|
+
# Cria uma conexao, uma sessao e um consumidor de qualquer tipo de mensagem
|
176
173
|
connection = @connection_factory.create_connection
|
177
174
|
session = connection.create_session(false, Session::AUTO_ACKNOWLEDGE)
|
178
175
|
consumer = session.create_consumer(@destination, @criteria_for_receiving[:selector])
|
@@ -180,15 +177,15 @@ module Sparrow
|
|
180
177
|
# Registra-se como ouvinte
|
181
178
|
consumer.message_listener = self
|
182
179
|
|
183
|
-
#
|
180
|
+
# Inicia a escuta de mensagens
|
184
181
|
connection.start
|
185
182
|
end
|
186
183
|
|
187
184
|
#
|
188
|
-
# Faz o enriquecimento do objeto mensagem e delega para o
|
185
|
+
# Faz o enriquecimento do objeto mensagem e delega para o metodo on_receive_message
|
189
186
|
# que, implementado pelas subclasses, efetivamente trata a mensagem.
|
190
187
|
#
|
191
|
-
#
|
188
|
+
# Nao deve ser re-implementado por subclasses.
|
192
189
|
#
|
193
190
|
def on_message(received_message)
|
194
191
|
class << received_message
|
@@ -199,8 +196,8 @@ module Sparrow
|
|
199
196
|
end
|
200
197
|
|
201
198
|
#
|
202
|
-
#
|
203
|
-
# definido para este listener (na
|
199
|
+
# E executado todas as vezes que chega uma mensagem que atenda aos criterios
|
200
|
+
# definido para este listener (na variavel de instancia @criteria).
|
204
201
|
#
|
205
202
|
# Invariavelmente deve ser re-implementado nas subclasses.
|
206
203
|
#
|
@@ -227,4 +224,4 @@ module Sparrow
|
|
227
224
|
end
|
228
225
|
end
|
229
226
|
end
|
230
|
-
end
|
227
|
+
end
|
data/lib/sparrow.rb
CHANGED
data/spec/connection_spec.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
require File.dirname(File.expand_path(__FILE__)) + '/spec_helper.rb'
|
2
2
|
|
3
3
|
#
|
4
|
-
#
|
5
|
-
# para
|
6
|
-
# onde
|
4
|
+
# Cenario de configuracao do cliente JMS, quando sao informadas as propriedades de ambiente
|
5
|
+
# para conexao com o servidor de aplicacoes e a inicializacao do contexto JNDI inicial,
|
6
|
+
# onde estao criadas as connection factories, queues e topics.
|
7
7
|
#
|
8
8
|
describe Sparrow::JMS::Connection::Client, ', quando esta sendo configurado,' do
|
9
9
|
|
@@ -45,8 +45,8 @@ describe Sparrow::JMS::Connection::Client, ', quando esta sendo configurado,' do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
#
|
48
|
-
#
|
49
|
-
#
|
48
|
+
# Cenario pos-configuracao do cliente JMS, quando as queues e os topicos ja devem estar
|
49
|
+
# disponiveis, e entao e possivel obter sender/receiver para elas.
|
50
50
|
#
|
51
51
|
describe Sparrow::JMS::Connection::Client, ', depois de ter sido configurado,' do
|
52
52
|
|
data/spec/messaging_spec.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require File.dirname(File.expand_path(__FILE__)) + '/spec_helper.rb'
|
2
2
|
|
3
3
|
#
|
4
|
-
#
|
5
|
-
# receber mensagens de
|
4
|
+
# Cenario pos-obtencao de um Sender e um Receiver, quando deve ser possivel enviar e
|
5
|
+
# receber mensagens de tres tipos (Texto, Objeto e Mapa) de uma queue especifica,
|
6
6
|
# individualmente ou em lote.
|
7
7
|
#
|
8
8
|
describe Sparrow::JMS::Messaging, ', quando tem um Sender e um Receiver para uma Queue especifica,' do
|
@@ -89,7 +89,7 @@ describe Sparrow::JMS::Messaging, ', quando tem um Sender e um Receiver para uma
|
|
89
89
|
map_message.set_long('id', my_id_long)
|
90
90
|
producer.send(map_message)
|
91
91
|
|
92
|
-
# Commita as
|
92
|
+
# Commita as tres mensagens enviadas na sessao
|
93
93
|
session.commit
|
94
94
|
end
|
95
95
|
|
@@ -118,8 +118,8 @@ describe Sparrow::JMS::Messaging, ', quando tem um Sender e um Receiver para uma
|
|
118
118
|
end
|
119
119
|
|
120
120
|
#
|
121
|
-
#
|
122
|
-
#
|
121
|
+
# Cenario pos-configuracao do cliente JMS, quando deve ser possivel escutar mensagens
|
122
|
+
# atraves de objetos listeners.
|
123
123
|
#
|
124
124
|
describe Sparrow::JMS::Messaging::Listener,
|
125
125
|
', quando um Listener se registra para escutar uma Queue especifica,' do
|
@@ -129,4 +129,4 @@ describe Sparrow::JMS::Messaging::Listener,
|
|
129
129
|
end
|
130
130
|
|
131
131
|
it 'deveria possibilitar escutar mensagens atraves de um listener'
|
132
|
-
end
|
132
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -4,12 +4,15 @@ require 'spec'
|
|
4
4
|
require File.dirname(File.expand_path(__FILE__)) + '/../lib/sparrow.rb'
|
5
5
|
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# Modulo com metodos uteis para as propertiess.
|
8
8
|
#
|
9
9
|
module SparrowHelperMethods
|
10
10
|
|
11
11
|
#
|
12
|
-
# Apenas cria, mas
|
12
|
+
# Apenas cria, mas nao faz o setup do cliente JMS.
|
13
|
+
#
|
14
|
+
# WARNING: OC4J will be used as Java EE application server, but any other could
|
15
|
+
# be used with no problems.
|
13
16
|
#
|
14
17
|
def create_jms_client
|
15
18
|
jms_client = Sparrow::JMS::Connection::Client.new do |properties|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: leandrosilva-sparrow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leandro Silva
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-03-
|
12
|
+
date: 2009-03-08 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|