jsparrow 1.1.1 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -1
- data/VERSION.yml +2 -2
- data/lib/client.rb +19 -77
- data/lib/connection.rb +133 -6
- data/lib/jsparrow.rb +1 -0
- data/lib/listener.rb +146 -0
- data/lib/messaging.rb +24 -120
- data/sample/{sample.rb → sample_queue.rb} +0 -0
- data/sample/sample_topic.rb +33 -0
- data/spec/client_spec.rb +54 -71
- data/spec/connection_spec.rb +37 -21
- data/spec/listener_spec.rb +40 -0
- data/spec/messaging_spec.rb +86 -107
- data/spec/spec_helper.rb +49 -9
- metadata +39 -35
data/README.rdoc
CHANGED
data/VERSION.yml
CHANGED
data/lib/client.rb
CHANGED
@@ -9,9 +9,8 @@ module JSparrow
|
|
9
9
|
# que prove o servico JMS.
|
10
10
|
#
|
11
11
|
class Client
|
12
|
-
def initialize(
|
13
|
-
@
|
14
|
-
@jndi_context_builder = jndi_context_builder
|
12
|
+
def initialize(connection)
|
13
|
+
@connection = connection
|
15
14
|
|
16
15
|
# Conexoes, filas, topicos, senders e receivers que serao habilitados
|
17
16
|
@connection_factories = {}
|
@@ -21,51 +20,28 @@ module JSparrow
|
|
21
20
|
@topics = {}
|
22
21
|
@topic_senders = {}
|
23
22
|
@topic_receivers = {}
|
24
|
-
|
25
|
-
# Foi iniciado?
|
26
|
-
@started = false
|
27
23
|
end
|
28
24
|
|
29
25
|
def is_started?
|
30
|
-
@
|
26
|
+
@connection.is_opened?
|
31
27
|
end
|
32
28
|
|
33
29
|
def start
|
34
|
-
|
35
|
-
|
36
|
-
begin
|
37
|
-
@jndi_context = @jndi_context_builder.build
|
38
|
-
rescue => cause
|
39
|
-
raise ClientInitializationError.new(@connection_config, cause)
|
40
|
-
end
|
30
|
+
@connection.open
|
41
31
|
|
42
32
|
@connection_factories, @queues, @topics = lookup_resources
|
43
|
-
|
44
|
-
@started = true
|
45
33
|
end
|
46
34
|
|
47
35
|
def is_stoped?
|
48
|
-
|
36
|
+
@connection.is_closed?
|
49
37
|
end
|
50
38
|
|
51
39
|
def stop
|
52
|
-
|
53
|
-
|
54
|
-
@jndi_context.close
|
55
|
-
|
56
|
-
@started = false
|
57
|
-
end
|
58
|
-
|
59
|
-
def queue_connection_factory_enabled?
|
60
|
-
@connection_config.enabled_connection_factories.include?(:queue_connection_factory)
|
40
|
+
@connection.close
|
61
41
|
end
|
62
42
|
|
63
|
-
def queue_connection_factory
|
64
|
-
@connection_factories[:queue_connection_factory]
|
65
|
-
end
|
66
|
-
|
67
43
|
def queue_enabled?(queue_name)
|
68
|
-
@
|
44
|
+
@connection.configuration.enabled_queues.include?(queue_name)
|
69
45
|
end
|
70
46
|
|
71
47
|
def queue(queue_name)
|
@@ -84,16 +60,8 @@ module JSparrow
|
|
84
60
|
Messaging::Receiver.new(queue_connection_factory, queue(queue_name))
|
85
61
|
end
|
86
62
|
|
87
|
-
def topic_connection_factory_enabled?
|
88
|
-
@connection_config.enabled_connection_factories.include?(:topic_connection_factory)
|
89
|
-
end
|
90
|
-
|
91
|
-
def topic_connection_factory
|
92
|
-
@connection_factories[:topic_connection_factory]
|
93
|
-
end
|
94
|
-
|
95
63
|
def topic_enabled?(topic_name)
|
96
|
-
@
|
64
|
+
@connection.configuration.enabled_topics.include?(topic_name)
|
97
65
|
end
|
98
66
|
|
99
67
|
def topic(topic_name)
|
@@ -115,47 +83,21 @@ module JSparrow
|
|
115
83
|
# -- Private methods -- #
|
116
84
|
private
|
117
85
|
|
118
|
-
def
|
119
|
-
@
|
120
|
-
@lookuped_queues = lookup_resource(@connection_config.enabled_queues)
|
121
|
-
@lookuped_topic = lookup_resource(@connection_config.enabled_topics)
|
122
|
-
|
123
|
-
return @lookuped_connection_factories, @lookuped_queues, @lookuped_topic
|
86
|
+
def queue_connection_factory
|
87
|
+
@connection_factories[:queue_connection_factory]
|
124
88
|
end
|
125
89
|
|
126
|
-
def
|
127
|
-
|
128
|
-
|
129
|
-
return lookuped unless jndi_names
|
130
|
-
|
131
|
-
jndi_names.each do |key, jndi_name|
|
132
|
-
lookuped[key] = @jndi_context.lookup(jndi_name)
|
133
|
-
end
|
134
|
-
|
135
|
-
lookuped
|
90
|
+
def topic_connection_factory
|
91
|
+
@connection_factories[:topic_connection_factory]
|
136
92
|
end
|
137
|
-
end
|
138
|
-
|
139
|
-
class ClientInitializationError < StandardError
|
140
|
-
attr_reader :config, :cause
|
141
|
-
|
142
|
-
def initialize(config, cause)
|
143
|
-
super("Could not open connection to server. Verify the config's config.")
|
144
|
-
|
145
|
-
@config = config
|
146
|
-
@cause = cause
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
class InvalidClientStateError < StandardError
|
151
|
-
attr_reader :state, :operation
|
152
93
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
94
|
+
def lookup_resources
|
95
|
+
lookuped_connection_factories = @connection.lookup_resources(@connection.configuration.enabled_connection_factories)
|
96
|
+
lookuped_queues = @connection.lookup_resources(@connection.configuration.enabled_queues)
|
97
|
+
lookuped_topic = @connection.lookup_resources(@connection.configuration.enabled_topics)
|
98
|
+
|
99
|
+
return lookuped_connection_factories, lookuped_queues, lookuped_topic
|
100
|
+
end
|
159
101
|
end
|
160
102
|
end
|
161
103
|
end
|
data/lib/connection.rb
CHANGED
@@ -9,27 +9,97 @@ module JSparrow
|
|
9
9
|
# Metodo usado para configurar a conexao com o provedor de JMS.
|
10
10
|
#
|
11
11
|
def self.configure
|
12
|
-
@@
|
12
|
+
@@configuration = Configuration.new
|
13
13
|
|
14
|
-
yield @@
|
14
|
+
yield @@configuration
|
15
15
|
|
16
|
-
@@
|
16
|
+
@@jndi_context_builder = JNDI::ContextBuilder.new(@@configuration.jms_client_jar, @@configuration.jndi_properties)
|
17
|
+
|
18
|
+
@@configuration
|
17
19
|
end
|
18
20
|
|
19
21
|
#
|
20
22
|
# Metodo usado para obter a configuracao para conexao com o provedor de JMS.
|
21
23
|
#
|
22
24
|
def self.configuration
|
23
|
-
@@
|
25
|
+
@@configuration
|
24
26
|
end
|
25
27
|
|
26
28
|
#
|
27
29
|
# Metodo usado para criar um novo Client JMS.
|
28
30
|
#
|
29
31
|
def self.new_client
|
30
|
-
|
32
|
+
connection = Base.new(@@configuration, @@jndi_context_builder)
|
33
|
+
|
34
|
+
Client.new(connection)
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# Metodo usado para criar um novo Listener de mensagens JMS.
|
39
|
+
#
|
40
|
+
def self.new_listener(listener_spec)
|
41
|
+
connection = Base.new(@@configuration, @@jndi_context_builder)
|
31
42
|
|
32
|
-
|
43
|
+
listener_spec[:as].new(connection)
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
# Classe base para estabelecer conexao com o provedor JMS via JNDI.
|
48
|
+
#
|
49
|
+
class Base
|
50
|
+
attr_reader :configuration
|
51
|
+
|
52
|
+
def initialize(configuration, jndi_context_builder)
|
53
|
+
@configuration = configuration
|
54
|
+
@jndi_context_builder = jndi_context_builder
|
55
|
+
|
56
|
+
# Foi estabelecida?
|
57
|
+
@opened = false
|
58
|
+
end
|
59
|
+
|
60
|
+
def is_opened?
|
61
|
+
@opened
|
62
|
+
end
|
63
|
+
|
64
|
+
def open
|
65
|
+
raise InvalidStateError.new('opened', 'open') if is_opened?
|
66
|
+
|
67
|
+
begin
|
68
|
+
@jndi_context = @jndi_context_builder.build
|
69
|
+
rescue => cause
|
70
|
+
raise InitializationError.new(@configuration, cause)
|
71
|
+
end
|
72
|
+
|
73
|
+
@opened = true
|
74
|
+
end
|
75
|
+
|
76
|
+
def is_closed?
|
77
|
+
not @opened
|
78
|
+
end
|
79
|
+
|
80
|
+
def close
|
81
|
+
raise InvalidStateError.new('closed', 'close') if is_closed?
|
82
|
+
|
83
|
+
@jndi_context.close
|
84
|
+
|
85
|
+
@opened = false
|
86
|
+
end
|
87
|
+
|
88
|
+
def lookup_resources(resources = {})
|
89
|
+
lookuped_resource = {}
|
90
|
+
|
91
|
+
return lookuped_resource unless resources
|
92
|
+
|
93
|
+
resources.each do |name, jndi_name|
|
94
|
+
lookuped_resource[name] = lookup_resource(jndi_name)
|
95
|
+
end
|
96
|
+
|
97
|
+
lookuped_resource
|
98
|
+
end
|
99
|
+
|
100
|
+
def lookup_resource(jndi_name)
|
101
|
+
@jndi_context.lookup(jndi_name)
|
102
|
+
end
|
33
103
|
end
|
34
104
|
|
35
105
|
#
|
@@ -40,26 +110,83 @@ module JSparrow
|
|
40
110
|
attr_reader :jms_client_jar, :jndi_properties,
|
41
111
|
:enabled_connection_factories, :enabled_queues, :enabled_topics
|
42
112
|
|
113
|
+
#
|
114
|
+
# Use:
|
115
|
+
#
|
116
|
+
# use_jms_client_jar "path/to/name_of_the_client_jar_file.jar"
|
117
|
+
#
|
43
118
|
def use_jms_client_jar(client_jar)
|
44
119
|
@jms_client_jar = client_jar
|
45
120
|
end
|
46
121
|
|
122
|
+
#
|
123
|
+
# Use:
|
124
|
+
#
|
125
|
+
# use_jndi_properties :a_jndi_property_name_in_lower_case => "a_value_of_property",
|
126
|
+
# :other_jndi_property_name_in_lower_case => "other_value_of_property"
|
127
|
+
#
|
47
128
|
def use_jndi_properties(jndi_properties = {})
|
48
129
|
@jndi_properties = jndi_properties
|
49
130
|
end
|
50
131
|
|
132
|
+
#
|
133
|
+
# Use:
|
134
|
+
#
|
135
|
+
# enable_connection_factories :queue_connection_factory => "jndi_name_of_queue_connection_factory",
|
136
|
+
# :topic_connection_factory => "jndi_name_of_topic_connection_factory"
|
137
|
+
#
|
51
138
|
def enable_connection_factories(jndi_names = {})
|
52
139
|
@enabled_connection_factories = jndi_names
|
53
140
|
end
|
54
141
|
|
142
|
+
#
|
143
|
+
# Use:
|
144
|
+
#
|
145
|
+
# enable_queues :a_queue_name_in_lower_case => "jndi_name_of_a_queue",
|
146
|
+
# :other_queue_name_in_lower_case => "jndi_name_of_other_queue"
|
147
|
+
#
|
55
148
|
def enable_queues(jndi_names = {})
|
56
149
|
@enabled_queues = jndi_names
|
57
150
|
end
|
58
151
|
|
152
|
+
#
|
153
|
+
# Use:
|
154
|
+
#
|
155
|
+
# enable_topics :a_topic_name_in_lower_case => "jndi_name_of_a_topic",
|
156
|
+
# :other_topic_name_in_lower_case => "jndi_name_of_other_topic"
|
157
|
+
#
|
59
158
|
def enable_topics(jndi_names = {})
|
60
159
|
@enabled_topics = jndi_names
|
61
160
|
end
|
62
161
|
end
|
162
|
+
|
163
|
+
#
|
164
|
+
# Erro para quando uma conexao esta num estado invalido para uma operacao (open ou close).
|
165
|
+
#
|
166
|
+
class InvalidStateError < StandardError
|
167
|
+
attr_reader :state, :operation
|
168
|
+
|
169
|
+
def initialize(state, operation)
|
170
|
+
super("Could not did #{operation} because connection is #{state}.")
|
171
|
+
|
172
|
+
@state = state
|
173
|
+
@operation = operation
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
#
|
178
|
+
# Erro para quando nao for possivel estabelecer conexao com o provedor JMS.
|
179
|
+
#
|
180
|
+
class InitializationError < StandardError
|
181
|
+
attr_reader :configuration, :cause
|
182
|
+
|
183
|
+
def initialize(configuration, cause)
|
184
|
+
super("Could not open connection to JMS provider. Verify the config's config.")
|
185
|
+
|
186
|
+
@configuration = configuration
|
187
|
+
@cause = cause
|
188
|
+
end
|
189
|
+
end
|
63
190
|
end
|
64
191
|
|
65
192
|
module JNDI
|
data/lib/jsparrow.rb
CHANGED
data/lib/listener.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
# Classes Java usadas nesse arquivo
|
2
|
+
import 'javax.naming.InitialContext'
|
3
|
+
import 'javax.jms.MessageListener'
|
4
|
+
|
5
|
+
module JSparrow
|
6
|
+
module Connection
|
7
|
+
|
8
|
+
#
|
9
|
+
# Ouvintes de mensagens.
|
10
|
+
#
|
11
|
+
# Sao como clientes JMS, mas apenas para recebimento de mensagens.
|
12
|
+
#
|
13
|
+
class Listener
|
14
|
+
include MessageListener
|
15
|
+
|
16
|
+
#
|
17
|
+
# Nome (configurado no setup da conexao) do destino JMS que sera escutado.
|
18
|
+
#
|
19
|
+
# Invariavelmente deve ser usado pelas subclasses, para informar o nome da queue
|
20
|
+
# ou topico que sera escutado.
|
21
|
+
#
|
22
|
+
# listen_to :queue => :registered_name_of_queue
|
23
|
+
# listen_to :topic => :registered_name_of_topic
|
24
|
+
#
|
25
|
+
def self.listen_to(destination)
|
26
|
+
configure(:listen_to_destination, destination)
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Criterios de selecao de mensagens, seguindo o padrao JMS.
|
31
|
+
#
|
32
|
+
# Invariavelmente as subclasses precisam usar esse metodo, se quiserem definir
|
33
|
+
# os criterios de recebimento que este listener levara em conta.
|
34
|
+
#
|
35
|
+
# receive_only_in_criteria :selector => "recipient = 'jsparrow-spec' and to_listener = 'TestQueueListener'"
|
36
|
+
#
|
37
|
+
def self.receive_only_in_criteria(criteria = {:selector => ''})
|
38
|
+
configure(:criteria_to_receiving, criteria)
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize(connection)
|
42
|
+
@connection = connection
|
43
|
+
end
|
44
|
+
|
45
|
+
def is_listening?
|
46
|
+
@connection.is_opened?
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Inicia a escuta de mensagens.
|
51
|
+
#
|
52
|
+
def start_listening
|
53
|
+
@connection.open
|
54
|
+
|
55
|
+
connection_factory, destination = lookup_resources
|
56
|
+
|
57
|
+
selector = criteria_to_receiving[:selector] if respond_to? :criteria_to_receiving
|
58
|
+
|
59
|
+
# Cria uma conexao para escuta de mensagens
|
60
|
+
@listening_connection = connection_factory.create_connection
|
61
|
+
|
62
|
+
# Cria uma sessao e um consumidor de qualquer tipo de mensagem
|
63
|
+
session = @listening_connection.create_session(false, Session::AUTO_ACKNOWLEDGE)
|
64
|
+
consumer = session.create_consumer(destination, selector)
|
65
|
+
|
66
|
+
# Registra-se como ouvinte
|
67
|
+
consumer.message_listener = self
|
68
|
+
|
69
|
+
# Inicia a escuta de mensagens
|
70
|
+
@listening_connection.start
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
# Finaliza a escuta de mensagens.
|
75
|
+
#
|
76
|
+
def stop_listening
|
77
|
+
@listening_connection.close
|
78
|
+
|
79
|
+
@connection.close
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
# Faz o enriquecimento do objeto mensagem e delega para o metodo on_receive_message
|
84
|
+
# que, implementado pelas subclasses, efetivamente trata a mensagem.
|
85
|
+
#
|
86
|
+
# Nao deve ser re-implementado por subclasses.
|
87
|
+
#
|
88
|
+
def on_message(received_message)
|
89
|
+
class << received_message
|
90
|
+
include Messaging::MessageType
|
91
|
+
end
|
92
|
+
|
93
|
+
on_receive_message(received_message)
|
94
|
+
end
|
95
|
+
|
96
|
+
#
|
97
|
+
# E executado todas as vezes que chega uma mensagem que atenda aos criterios
|
98
|
+
# definido para este listener (na variavel de instancia @criteria_for_receiving).
|
99
|
+
#
|
100
|
+
# Invariavelmente deve ser re-implementado nas subclasses.
|
101
|
+
#
|
102
|
+
def on_receive_message(received_message)
|
103
|
+
raise Error::AbstractMethodError.new(self.class.superclass, 'on_receive_message')
|
104
|
+
end
|
105
|
+
|
106
|
+
# --- Private methods --- #
|
107
|
+
private
|
108
|
+
|
109
|
+
def self.configure(attribute, value)
|
110
|
+
self.instance_eval do
|
111
|
+
send(:define_method, attribute) do
|
112
|
+
value
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def lookup_resources
|
118
|
+
destination_type, destination_name = get_destination_info
|
119
|
+
|
120
|
+
jndi_name_of_connection_factory = get_jndi_name_of_connection_factory(destination_type, destination_name)
|
121
|
+
jndi_name_of_destination = get_jndi_name_of_destination(destination_type, destination_name)
|
122
|
+
|
123
|
+
lookuped_connection_factory = @connection.lookup_resource(jndi_name_of_connection_factory)
|
124
|
+
lookuped_destination = @connection.lookup_resource(jndi_name_of_destination)
|
125
|
+
|
126
|
+
return lookuped_connection_factory, lookuped_destination
|
127
|
+
end
|
128
|
+
|
129
|
+
def get_destination_info
|
130
|
+
return listen_to_destination.keys[0], listen_to_destination.values[0]
|
131
|
+
end
|
132
|
+
|
133
|
+
def get_jndi_name_of_connection_factory(destination_type, destination_name)
|
134
|
+
connection_factory_name = "#{destination_type}_connection_factory".to_sym
|
135
|
+
|
136
|
+
@connection.configuration.enabled_connection_factories[connection_factory_name]
|
137
|
+
end
|
138
|
+
|
139
|
+
def get_jndi_name_of_destination(destination_type, destination_name)
|
140
|
+
enabled_method_for_destinations = "enabled_#{destination_type}s"
|
141
|
+
|
142
|
+
@connection.configuration.send(enabled_method_for_destinations)[destination_name]
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
data/lib/messaging.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# Classes Java usadas nesse arquivo
|
2
2
|
import 'javax.jms.Session'
|
3
|
-
import 'javax.jms.MessageListener'
|
4
3
|
|
5
4
|
module JSparrow
|
6
5
|
module Messaging
|
@@ -80,22 +79,22 @@ module JSparrow
|
|
80
79
|
# --- Private methods --- #
|
81
80
|
private
|
82
81
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
82
|
+
def send_message(&message_creator)
|
83
|
+
# Cria uma conexao, uma sessao e um emissor de qualquer tipo de mensagem
|
84
|
+
connection = @connection_factory.create_connection
|
85
|
+
session = connection.create_session(true, Session::AUTO_ACKNOWLEDGE)
|
86
|
+
producer = session.create_producer(@destination)
|
88
87
|
|
89
|
-
|
90
|
-
|
88
|
+
# Obtem uma mensagem (TextMessage, ObjectMessage ou MapMessage) do criador especifico
|
89
|
+
message = message_creator.call(session)
|
91
90
|
|
92
|
-
|
93
|
-
|
91
|
+
# Envia a mensagem
|
92
|
+
producer.send(message)
|
94
93
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
94
|
+
# Commita a sessao e fecha a conexao
|
95
|
+
session.commit
|
96
|
+
connection.close
|
97
|
+
end
|
99
98
|
end
|
100
99
|
|
101
100
|
#
|
@@ -128,117 +127,22 @@ module JSparrow
|
|
128
127
|
connection.close
|
129
128
|
end
|
130
129
|
end
|
131
|
-
|
132
|
-
#
|
133
|
-
# Ouvintes de mensagens.
|
130
|
+
|
134
131
|
#
|
135
|
-
#
|
136
|
-
# acho que agora ta bem proximo do que deve ser.)
|
132
|
+
# Identifica o tipo de uma mensagem.
|
137
133
|
#
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
attr_reader :connection_factory_name, :destination_name, :criteria_to_receiving
|
142
|
-
|
143
|
-
#
|
144
|
-
# Estes parametros serao injetados pelo listener manager de acordo com o
|
145
|
-
# que houver sido definido pelos metodos connection_factory_name e destination_name.
|
146
|
-
#
|
147
|
-
def initialize(connection_factory, destination)
|
148
|
-
super(connection_factory, destination)
|
149
|
-
|
150
|
-
@connection_factory_name = 'undefined'
|
151
|
-
@destination_name = 'undefined'
|
152
|
-
@criteria_to_receiving = {}
|
153
|
-
end
|
154
|
-
|
155
|
-
#
|
156
|
-
# Nome JNDI da connection factory que ser usada para criar conexoes JMS.
|
157
|
-
#
|
158
|
-
# Invariavelmente deve ser usado pelas subclasses para informar qual devera
|
159
|
-
# ser a connection factory usada por esse listener.
|
160
|
-
#
|
161
|
-
def use_connection_factory(jndi_name)
|
162
|
-
@connection_factory_name = jndi_name
|
134
|
+
module MessageType
|
135
|
+
def is_text_message?
|
136
|
+
respond_to? :get_text
|
163
137
|
end
|
164
|
-
|
165
|
-
#
|
166
|
-
# Nome JNDI do destino JMS que sera escutado.
|
167
|
-
#
|
168
|
-
# Invariavelmente deve ser usado pelas subclasses, para informar o nome
|
169
|
-
# da queue ou topico que sera escutado.
|
170
|
-
#
|
171
|
-
def listen_to_destination(jndi_name)
|
172
|
-
@destination_name = jndi_name
|
173
|
-
end
|
174
|
-
|
175
|
-
#
|
176
|
-
# Criterios de selecao de mensagens, seguindo o padrao JMS.
|
177
|
-
#
|
178
|
-
# Invariavelmente as subclasses precisam usar esse metodo para definir
|
179
|
-
# os criterios de recebimento que este listener levara em conta.
|
180
|
-
#
|
181
|
-
def receive_only_in_criteria(criteria = {:timeout => DEFAULT_RECEIVER_TIMEOUT, :selector => ''})
|
182
|
-
# Valor default para timeout, caso nao tenha sido informado
|
183
|
-
@criteria_to_receiving[:timeout] = criteria[:timeout] || DEFAULT_RECEIVER_TIMEOUT
|
184
|
-
end
|
185
|
-
|
186
|
-
#
|
187
|
-
# Inicia a escuta de mensagens.
|
188
|
-
#
|
189
|
-
def start_listening
|
190
|
-
# Cria uma conexao, uma sessao e um consumidor de qualquer tipo de mensagem
|
191
|
-
connection = @connection_factory.create_connection
|
192
|
-
session = connection.create_session(false, Session::AUTO_ACKNOWLEDGE)
|
193
|
-
consumer = session.create_consumer(@destination, @criteria_for_receiving[:selector])
|
194
|
-
|
195
|
-
# Registra-se como ouvinte
|
196
|
-
consumer.message_listener = self
|
197
|
-
|
198
|
-
# Inicia a escuta de mensagens
|
199
|
-
connection.start
|
200
|
-
end
|
201
|
-
|
202
|
-
#
|
203
|
-
# Faz o enriquecimento do objeto mensagem e delega para o metodo on_receive_message
|
204
|
-
# que, implementado pelas subclasses, efetivamente trata a mensagem.
|
205
|
-
#
|
206
|
-
# Nao deve ser re-implementado por subclasses.
|
207
|
-
#
|
208
|
-
def on_message(received_message)
|
209
|
-
class << received_message
|
210
|
-
include MessageType
|
211
|
-
end
|
212
|
-
|
213
|
-
on_receive_message(received_message)
|
214
|
-
end
|
215
|
-
|
216
|
-
#
|
217
|
-
# E executado todas as vezes que chega uma mensagem que atenda aos criterios
|
218
|
-
# definido para este listener (na variavel de instancia @criteria_for_receiving).
|
219
|
-
#
|
220
|
-
# Invariavelmente deve ser re-implementado nas subclasses.
|
221
|
-
#
|
222
|
-
def on_receive_message(received_message)
|
223
|
-
raise Error::AbstractMethodError.new('on_receive_message')
|
224
|
-
end
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
#
|
229
|
-
# Identifica o tipo de uma mensagem.
|
230
|
-
#
|
231
|
-
module MessageType
|
232
|
-
def is_text_message?
|
233
|
-
respond_to? :get_text
|
234
|
-
end
|
235
138
|
|
236
|
-
|
237
|
-
|
238
|
-
|
139
|
+
def is_object_message?
|
140
|
+
(respond_to? :get_object and !(respond_to? :get_long))
|
141
|
+
end
|
239
142
|
|
240
|
-
|
241
|
-
|
143
|
+
def is_map_message?
|
144
|
+
respond_to? :get_long
|
145
|
+
end
|
242
146
|
end
|
243
147
|
end
|
244
148
|
end
|
File without changes
|