jsparrow 1.1.1 → 1.1.2
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 +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
         
     |