Class: Sparrow::JMS::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.



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

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.



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

def connection_factory_name
  @connection_factory_name
end

#criteria_to_receivingObject (readonly)

Returns the value of attribute criteria_to_receiving.



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

def criteria_to_receiving
  @criteria_to_receiving
end

#destination_nameObject (readonly)

Returns the value of attribute destination_name.



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

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.



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

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.



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

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).

Invariavelmente deve ser re-implementado nas subclasses.



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

def on_receive_message(received_message)
  raise Utils::Exception::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.



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

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.



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

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.



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

def use_connection_factory(jndi_name)
  @connection_factory_name = jndi_name
end