Class: JSparrow::Messaging::Listener

Inherits:
Base
  • Object
show all
Includes:
MessageListener
Defined in:
lib/messaging.rb

Overview

Ouvintes de mensagens.

TODO: Completar a implementacao. Ainda nao esta legal. (Ja dei um tapinha,

acho que agora ta bem proximo do que deve ser.)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(connection_factory, destination) ⇒ Listener

Estes parametros serao injetados pelo listener manager de acordo com o que houver sido definido pelos metodos connection_factory_name e destination_name.



147
148
149
150
151
152
153
# File 'lib/messaging.rb', line 147

def initialize(connection_factory, destination)
  super(connection_factory, destination)
  
  @connection_factory_name = 'undefined'
  @destination_name        = 'undefined'
  @criteria_to_receiving   = {}
end

Instance Attribute Details

#connection_factory_nameObject (readonly)

Returns the value of attribute connection_factory_name.



141
142
143
# File 'lib/messaging.rb', line 141

def connection_factory_name
  @connection_factory_name
end

#criteria_to_receivingObject (readonly)

Returns the value of attribute criteria_to_receiving.



141
142
143
# File 'lib/messaging.rb', line 141

def criteria_to_receiving
  @criteria_to_receiving
end

#destination_nameObject (readonly)

Returns the value of attribute destination_name.



141
142
143
# File 'lib/messaging.rb', line 141

def destination_name
  @destination_name
end

Instance Method Details

#listen_to_destination(jndi_name) ⇒ Object

Nome JNDI do destino JMS que sera escutado.

Invariavelmente deve ser usado pelas subclasses, para informar o nome da queue ou topico que sera escutado.



171
172
173
# File 'lib/messaging.rb', line 171

def listen_to_destination(jndi_name)
  @destination_name = jndi_name
end

#on_message(received_message) ⇒ Object

Faz o enriquecimento do objeto mensagem e delega para o metodo on_receive_message que, implementado pelas subclasses, efetivamente trata a mensagem.

Nao deve ser re-implementado por subclasses.



208
209
210
211
212
213
214
# File 'lib/messaging.rb', line 208

def on_message(received_message)
  class << received_message
    include MessageType
  end
  
  on_receive_message(received_message)
end

#on_receive_message(received_message) ⇒ Object

E executado todas as vezes que chega uma mensagem que atenda aos criterios definido para este listener (na variavel de instancia @criteria_for_receiving).

Invariavelmente deve ser re-implementado nas subclasses.



222
223
224
# File 'lib/messaging.rb', line 222

def on_receive_message(received_message)
  raise Error::AbstractMethodError.new('on_receive_message')
end

#receive_only_in_criteria(criteria = {:timeout => DEFAULT_RECEIVER_TIMEOUT, :selector => ''}) ⇒ Object

Criterios de selecao de mensagens, seguindo o padrao JMS.

Invariavelmente as subclasses precisam usar esse metodo para definir os criterios de recebimento que este listener levara em conta.



181
182
183
184
# File 'lib/messaging.rb', line 181

def receive_only_in_criteria(criteria = {:timeout => DEFAULT_RECEIVER_TIMEOUT, :selector => ''})
  # Valor default para timeout, caso nao tenha sido informado
  @criteria_to_receiving[:timeout] = criteria[:timeout] || DEFAULT_RECEIVER_TIMEOUT
end

#start_listeningObject

Inicia a escuta de mensagens.



189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/messaging.rb', line 189

def start_listening
  # Cria uma conexao, uma sessao e um consumidor de qualquer tipo de mensagem
  connection = @connection_factory.create_connection
  session    = connection.create_session(false, Session::AUTO_ACKNOWLEDGE)
  consumer   = session.create_consumer(@destination, @criteria_for_receiving[:selector])
  
  # Registra-se como ouvinte
  consumer.message_listener = self
  
  # Inicia a escuta de mensagens
  connection.start
end

#use_connection_factory(jndi_name) ⇒ Object

Nome JNDI da connection factory que ser usada para criar conexoes JMS.

Invariavelmente deve ser usado pelas subclasses para informar qual devera ser a connection factory usada por esse listener.



161
162
163
# File 'lib/messaging.rb', line 161

def use_connection_factory(jndi_name)
  @connection_factory_name = jndi_name
end