modern_times 0.1.2 → 0.2.0
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 +24 -12
 - data/Rakefile +2 -2
 - data/VERSION +1 -1
 - data/examples/README +4 -0
 - data/examples/jms.yml +9 -0
 - data/examples/requestor/README +4 -2
 - data/examples/requestor/manager.rb +3 -2
 - data/examples/requestor/request.rb +5 -4
 - data/examples/requestor/reverse_echo_worker.rb +3 -2
 - data/examples/simple/README +7 -4
 - data/examples/simple/bar_worker.rb +4 -1
 - data/examples/simple/baz_worker.rb +4 -3
 - data/examples/simple/manager.rb +3 -2
 - data/examples/simple/publish.rb +6 -5
 - data/lib/modern_times.rb +20 -2
 - data/lib/modern_times/base/supervisor.rb +14 -21
 - data/lib/modern_times/base/supervisor_mbean.rb +4 -6
 - data/lib/modern_times/base/worker.rb +17 -26
 - data/lib/modern_times/jms.rb +23 -0
 - data/lib/modern_times/{hornetq/client.rb → jms/connection.rb} +19 -12
 - data/lib/modern_times/jms/publisher.rb +91 -0
 - data/lib/modern_times/jms/supervisor.rb +19 -0
 - data/lib/modern_times/jms/supervisor_mbean.rb +11 -0
 - data/lib/modern_times/jms/worker.rb +166 -0
 - data/lib/modern_times/jms_requestor.rb +10 -0
 - data/lib/modern_times/jms_requestor/request_handle.rb +33 -0
 - data/lib/modern_times/jms_requestor/requestor.rb +45 -0
 - data/lib/modern_times/jms_requestor/supervisor.rb +45 -0
 - data/lib/modern_times/jms_requestor/supervisor_mbean.rb +21 -0
 - data/lib/modern_times/jms_requestor/worker.rb +78 -0
 - data/lib/modern_times/manager.rb +14 -9
 - data/lib/modern_times/manager_mbean.rb +14 -7
 - data/lib/modern_times/marshal_strategy.rb +47 -0
 - data/lib/modern_times/marshal_strategy/bson.rb +31 -0
 - data/lib/modern_times/marshal_strategy/json.rb +30 -0
 - data/lib/modern_times/marshal_strategy/ruby.rb +20 -0
 - data/lib/modern_times/marshal_strategy/string.rb +19 -0
 - data/lib/modern_times/railsable.rb +17 -74
 - data/test/base_test.rb +248 -0
 - data/test/jms.yml +8 -0
 - data/test/jms_requestor_test.rb +263 -0
 - data/test/jms_test.rb +296 -0
 - data/test/marshal_strategy_test.rb +39 -0
 - metadata +49 -46
 - data/examples/requestor/hornetq.yml +0 -14
 - data/examples/simple/hornetq.yml +0 -14
 - data/lib/modern_times/hornetq.rb +0 -11
 - data/lib/modern_times/hornetq/marshal_strategy.rb +0 -3
 - data/lib/modern_times/hornetq/marshal_strategy/json.rb +0 -17
 - data/lib/modern_times/hornetq/marshal_strategy/ruby.rb +0 -17
 - data/lib/modern_times/hornetq/marshal_strategy/string.rb +0 -17
 - data/lib/modern_times/hornetq/publisher.rb +0 -65
 - data/lib/modern_times/hornetq/supervisor.rb +0 -22
 - data/lib/modern_times/hornetq/supervisor_mbean.rb +0 -12
 - data/lib/modern_times/hornetq/worker.rb +0 -127
 - data/lib/modern_times/hornetq_requestor.rb +0 -9
 - data/lib/modern_times/hornetq_requestor/request_handle.rb +0 -49
 - data/lib/modern_times/hornetq_requestor/requestor.rb +0 -48
 - data/lib/modern_times/hornetq_requestor/worker.rb +0 -29
 - data/lib/modern_times/thread.rb +0 -16
 - data/test/base/worker_test.rb +0 -38
 - data/test/messaging/worker_manager_test.rb +0 -58
 - data/test/messaging/worker_test.rb +0 -58
 - data/test/worker_manager_test.rb +0 -48
 
    
        data/README.rdoc
    CHANGED
    
    | 
         @@ -4,11 +4,20 @@ 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            == Description:
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
            JRuby library for performing background tasks via  
     | 
| 
      
 7 
     | 
    
         
            +
            JRuby library for performing background tasks via JMS.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            Very much alpha stage at this point.
         
     | 
| 
       8 
10 
     | 
    
         | 
| 
       9 
11 
     | 
    
         
             
            == Features/Problems:
         
     | 
| 
       10 
12 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
            *  
     | 
| 
      
 13 
     | 
    
         
            +
            * Ruby marshaling doesn't work
         
     | 
| 
      
 14 
     | 
    
         
            +
            * jms_test doesn't exit
         
     | 
| 
      
 15 
     | 
    
         
            +
            * jms_requestor needs testing for dummy requesting
         
     | 
| 
      
 16 
     | 
    
         
            +
            * Allow options (durable queues, etc)
         
     | 
| 
      
 17 
     | 
    
         
            +
            * Railsable needs testing
         
     | 
| 
      
 18 
     | 
    
         
            +
            * Fail options (fail queues, etc.)
         
     | 
| 
      
 19 
     | 
    
         
            +
            * Return exception for jms_requestor
         
     | 
| 
      
 20 
     | 
    
         
            +
            * Currently tested only for ActiveMQ
         
     | 
| 
       12 
21 
     | 
    
         | 
| 
       13 
22 
     | 
    
         
             
            == Install:
         
     | 
| 
       14 
23 
     | 
    
         | 
| 
         @@ -16,27 +25,30 @@ JRuby library for performing background tasks via the hornetq messaging library. 
     | 
|
| 
       16 
25 
     | 
    
         | 
| 
       17 
26 
     | 
    
         
             
            == Rails Usage:
         
     | 
| 
       18 
27 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
            TODO: This section needs updating for JMS
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            Create config/jms.yml which might look as follows:
         
     | 
| 
       20 
31 
     | 
    
         | 
| 
       21 
32 
     | 
    
         
             
                development:
         
     | 
| 
       22 
33 
     | 
    
         
             
                  :connection: hornetq://invm
         
     | 
| 
       23 
34 
     | 
    
         | 
| 
       24 
35 
     | 
    
         
             
                production:
         
     | 
| 
       25 
36 
     | 
    
         
             
                  :connection:
         
     | 
| 
       26 
     | 
    
         
            -
                    : 
     | 
| 
       27 
     | 
    
         
            -
                    : 
     | 
| 
       28 
     | 
    
         
            -
                    : 
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
      
 37 
     | 
    
         
            +
                    :factory: org.apache.activemq.ActiveMQConnectionFactory
         
     | 
| 
      
 38 
     | 
    
         
            +
                    :broker_url: tcp://msghost:61616
         
     | 
| 
      
 39 
     | 
    
         
            +
                    :require_jars:
         
     | 
| 
      
 40 
     | 
    
         
            +
                      - <%= Dir.glob("#{ENV['ACTIVEMQ_HOME']}/activemq-all-*.jar")[0] %>
         
     | 
| 
      
 41 
     | 
    
         
            +
                      - <%= Dir.glob("#{ENV['ACTIVEMQ_HOME']}/lib/optional/slf4j-log4j*.jar")[0] %>
         
     | 
| 
      
 42 
     | 
    
         
            +
                      - <%= Dir.glob("#{ENV['ACTIVEMQ_HOME']}/lib/optional/log4j-*.jar")[0] %>
         
     | 
| 
       31 
43 
     | 
    
         
             
                  :session:
         
     | 
| 
       32 
     | 
    
         
            -
                    :username:  
     | 
| 
       33 
     | 
    
         
            -
                    :password:  
     | 
| 
      
 44 
     | 
    
         
            +
                    :username: myuser
         
     | 
| 
      
 45 
     | 
    
         
            +
                    :password: mypassword
         
     | 
| 
       34 
46 
     | 
    
         | 
| 
       35 
47 
     | 
    
         
             
            In config/environment.rb, add the following lines:
         
     | 
| 
       36 
48 
     | 
    
         | 
| 
       37 
49 
     | 
    
         
             
                ModernTimes.init_rails
         
     | 
| 
       38 
50 
     | 
    
         
             
                # Publishers can be defined wherever appropriate
         
     | 
| 
       39 
     | 
    
         
            -
                $foo_publisher = ModernTimes:: 
     | 
| 
      
 51 
     | 
    
         
            +
                $foo_publisher = ModernTimes::JMS::Publisher.new('Foo')
         
     | 
| 
       40 
52 
     | 
    
         | 
| 
       41 
53 
     | 
    
         
             
            In your code, queue foo objects:
         
     | 
| 
       42 
54 
     | 
    
         | 
| 
         @@ -136,7 +148,7 @@ I'm a Chaplin fan. 
     | 
|
| 
       136 
148 
     | 
    
         | 
| 
       137 
149 
     | 
    
         
             
            == Author
         
     | 
| 
       138 
150 
     | 
    
         | 
| 
       139 
     | 
    
         
            -
            Brad Pardee 
     | 
| 
      
 151 
     | 
    
         
            +
            Brad Pardee
         
     | 
| 
       140 
152 
     | 
    
         | 
| 
       141 
153 
     | 
    
         
             
            == Copyright
         
     | 
| 
       142 
154 
     | 
    
         | 
    
        data/Rakefile
    CHANGED
    
    | 
         @@ -1,5 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'rubygems'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'rake'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'rake/testtask'
         
     | 
| 
       3 
4 
     | 
    
         | 
| 
       4 
5 
     | 
    
         
             
            begin
         
     | 
| 
       5 
6 
     | 
    
         
             
              require 'jeweler'
         
     | 
| 
         @@ -10,9 +11,8 @@ begin 
     | 
|
| 
       10 
11 
     | 
    
         
             
                gemspec.authors = ['Brad Pardee', 'Reid Morrison']
         
     | 
| 
       11 
12 
     | 
    
         
             
                gemspec.email = ['bradpardee@gmail.com', 'rubywmq@gmail.com']
         
     | 
| 
       12 
13 
     | 
    
         
             
                gemspec.homepage = 'http://github.com/ClarityServices/modern_times'
         
     | 
| 
       13 
     | 
    
         
            -
                gemspec.add_dependency 'jruby- 
     | 
| 
      
 14 
     | 
    
         
            +
                gemspec.add_dependency 'jruby-jms', ['>= 0.11.0']
         
     | 
| 
       14 
15 
     | 
    
         
             
                gemspec.add_dependency 'jmx',  ['>= 0.6']
         
     | 
| 
       15 
     | 
    
         
            -
                gemspec.add_dependency 'json'
         
     | 
| 
       16 
16 
     | 
    
         
             
              end
         
     | 
| 
       17 
17 
     | 
    
         
             
            rescue LoadError
         
     | 
| 
       18 
18 
     | 
    
         
             
              puts 'Jeweler not available. Install it with: gem install jeweler'
         
     | 
    
        data/VERSION
    CHANGED
    
    | 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            0. 
     | 
| 
      
 1 
     | 
    
         
            +
            0.2.0
         
     | 
    
        data/examples/README
    ADDED
    
    | 
         @@ -0,0 +1,4 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            In order to run the examples, you might need to modify the jms.yml file
         
     | 
| 
      
 2 
     | 
    
         
            +
            in this directory.  Also, you may have to set the enviroment variable
         
     | 
| 
      
 3 
     | 
    
         
            +
            ACTIVEMQ_HOME in order to run with no jms.yml file changes.  Refer to
         
     | 
| 
      
 4 
     | 
    
         
            +
            the jruby-jms project for more options for the jms.yml file.
         
     | 
    
        data/examples/jms.yml
    ADDED
    
    | 
         @@ -0,0 +1,9 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            :factory: org.apache.activemq.ActiveMQConnectionFactory
         
     | 
| 
      
 2 
     | 
    
         
            +
            :broker_url: tcp://localhost:61616
         
     | 
| 
      
 3 
     | 
    
         
            +
            :require_jars:
         
     | 
| 
      
 4 
     | 
    
         
            +
              - <%= Dir.glob("#{ENV['ACTIVEMQ_HOME']}/activemq-all-*.jar")[0] %>
         
     | 
| 
      
 5 
     | 
    
         
            +
              #Uncomment the following for 5.5 version
         
     | 
| 
      
 6 
     | 
    
         
            +
              #- <%= Dir.glob("#{ENV['ACTIVEMQ_HOME']}/lib/optional/slf4j-log4j*.jar")[0] %>
         
     | 
| 
      
 7 
     | 
    
         
            +
              #- <%= Dir.glob("#{ENV['ACTIVEMQ_HOME']}/lib/optional/log4j-*.jar")[0] %>
         
     | 
| 
      
 8 
     | 
    
         
            +
            #:username: myuser
         
     | 
| 
      
 9 
     | 
    
         
            +
            #:password: mypassword
         
     | 
    
        data/examples/requestor/README
    CHANGED
    
    | 
         @@ -1,6 +1,8 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Step 0
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Follow the directions for configuring jms.yml located in examples/README
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
       1 
4 
     | 
    
         
             
            # Step 1
         
     | 
| 
       2 
     | 
    
         
            -
            # Start  
     | 
| 
       3 
     | 
    
         
            -
            hornetq_server hornetq.yml server
         
     | 
| 
      
 5 
     | 
    
         
            +
            # Start an ActiveMQ Server
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
7 
     | 
    
         
             
            # Step 2
         
     | 
| 
       6 
8 
     | 
    
         
             
            # Start up the manager
         
     | 
| 
         @@ -2,12 +2,13 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            require 'rubygems'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'erb'
         
     | 
| 
       5 
6 
     | 
    
         
             
            require 'modern_times'
         
     | 
| 
       6 
7 
     | 
    
         
             
            require 'yaml'
         
     | 
| 
       7 
8 
     | 
    
         
             
            require 'reverse_echo_worker'
         
     | 
| 
       8 
9 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
            config = YAML. 
     | 
| 
       10 
     | 
    
         
            -
            ModernTimes:: 
     | 
| 
      
 10 
     | 
    
         
            +
            config = YAML.load(ERB.new(File.read(File.join(File.dirname(__FILE__), '..', 'jms.yml'))).result(binding))
         
     | 
| 
      
 11 
     | 
    
         
            +
            ModernTimes::JMS::Connection.init(config)
         
     | 
| 
       11 
12 
     | 
    
         | 
| 
       12 
13 
     | 
    
         
             
            manager = ModernTimes::Manager.new
         
     | 
| 
       13 
14 
     | 
    
         
             
            manager.stop_on_signal
         
     | 
| 
         @@ -2,6 +2,7 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            require 'rubygems'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'erb'
         
     | 
| 
       5 
6 
     | 
    
         
             
            require 'modern_times'
         
     | 
| 
       6 
7 
     | 
    
         
             
            require 'yaml'
         
     | 
| 
       7 
8 
     | 
    
         
             
            require 'reverse_echo_worker'
         
     | 
| 
         @@ -16,9 +17,9 @@ $timeout     = (ARGV[1] || 4).to_f 
     | 
|
| 
       16 
17 
     | 
    
         
             
            $sleep_time  = (ARGV[2] || 2).to_i
         
     | 
| 
       17 
18 
     | 
    
         
             
            $sim_count   = (ARGV[3] || 1).to_i
         
     | 
| 
       18 
19 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
            config = YAML. 
     | 
| 
       20 
     | 
    
         
            -
            ModernTimes:: 
     | 
| 
       21 
     | 
    
         
            -
            $requestor = ModernTimes:: 
     | 
| 
      
 20 
     | 
    
         
            +
            config = YAML.load(ERB.new(File.read(File.join(File.dirname(__FILE__), '..', 'jms.yml'))).result(binding))
         
     | 
| 
      
 21 
     | 
    
         
            +
            ModernTimes::JMS::Connection.init(config)
         
     | 
| 
      
 22 
     | 
    
         
            +
            $requestor = ModernTimes::JMSRequestor::Requestor.new(:queue_name => ReverseEchoWorker.default_name, :marshal => :string)
         
     | 
| 
       22 
23 
     | 
    
         | 
| 
       23 
24 
     | 
    
         
             
            def make_request(ident='')
         
     | 
| 
       24 
25 
     | 
    
         
             
              puts "#{ident}Making request at #{Time.now.to_f}"
         
     | 
| 
         @@ -29,7 +30,7 @@ def make_request(ident='') 
     | 
|
| 
       29 
30 
     | 
    
         
             
              response = handle.read_response
         
     | 
| 
       30 
31 
     | 
    
         
             
              puts "#{ident}Received at #{Time.now.to_f}: #{response}"
         
     | 
| 
       31 
32 
     | 
    
         
             
            rescue Exception => e
         
     | 
| 
       32 
     | 
    
         
            -
              puts "#{ident}Exception: #{e.message}"
         
     | 
| 
      
 33 
     | 
    
         
            +
              puts "#{ident}Exception: #{e.message}\n\t#{e.backtrace.join("\n\t")}"
         
     | 
| 
       33 
34 
     | 
    
         
             
            end
         
     | 
| 
       34 
35 
     | 
    
         | 
| 
       35 
36 
     | 
    
         
             
            if $sim_count == 1
         
     | 
| 
         @@ -1,5 +1,6 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            class ReverseEchoWorker 
     | 
| 
       2 
     | 
    
         
            -
              include ModernTimes:: 
     | 
| 
      
 1 
     | 
    
         
            +
            class ReverseEchoWorker
         
     | 
| 
      
 2 
     | 
    
         
            +
              include ModernTimes::JMSRequestor::Worker
         
     | 
| 
      
 3 
     | 
    
         
            +
              marshal :string
         
     | 
| 
       3 
4 
     | 
    
         | 
| 
       4 
5 
     | 
    
         
             
              def request(obj)
         
     | 
| 
       5 
6 
     | 
    
         
             
                puts "#{self}: Received #{obj} at #{Time.now}"
         
     | 
    
        data/examples/simple/README
    CHANGED
    
    | 
         @@ -1,9 +1,12 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Step 0
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Follow the directions for configuring jms.yml located in examples/README
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
       1 
4 
     | 
    
         
             
            # Step 1
         
     | 
| 
       2 
     | 
    
         
            -
            # Start a  
     | 
| 
       3 
     | 
    
         
            -
            hornetq_server hornetq.yml server
         
     | 
| 
      
 5 
     | 
    
         
            +
            # Start a JMS Server
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
7 
     | 
    
         
             
            # Step 2
         
     | 
| 
       6 
8 
     | 
    
         
             
            # Start up the manager
         
     | 
| 
      
 9 
     | 
    
         
            +
            rm -f modern_times.state
         
     | 
| 
       7 
10 
     | 
    
         
             
            jruby manager.rb
         
     | 
| 
       8 
11 
     | 
    
         | 
| 
       9 
12 
     | 
    
         
             
            # Step 3
         
     | 
| 
         @@ -11,8 +14,8 @@ jruby manager.rb 
     | 
|
| 
       11 
14 
     | 
    
         
             
            # Attach to the manager process
         
     | 
| 
       12 
15 
     | 
    
         
             
            # Go to the MBeans tab
         
     | 
| 
       13 
16 
     | 
    
         
             
            # Open up the tree to ModernTimes => Manager => Operations => start_worker
         
     | 
| 
       14 
     | 
    
         
            -
            # Enter BarWorker for worker  
     | 
| 
       15 
     | 
    
         
            -
            # Enter BazWorker for worker  
     | 
| 
      
 17 
     | 
    
         
            +
            # Enter BarWorker for worker, 2 for count, clear the options field, and click the start_worker button.
         
     | 
| 
      
 18 
     | 
    
         
            +
            # Enter BazWorker for worker, 3 for count, clear the options field, and click the start_worker button.
         
     | 
| 
       16 
19 
     | 
    
         | 
| 
       17 
20 
     | 
    
         
             
            # Step 4
         
     | 
| 
       18 
21 
     | 
    
         
             
            # Publish 10 messages to the BarWorker and 20 to the BazWorker
         
     | 
    
        data/examples/simple/manager.rb
    CHANGED
    
    | 
         @@ -2,13 +2,14 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            require 'rubygems'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'erb'
         
     | 
| 
       5 
6 
     | 
    
         
             
            require 'modern_times'
         
     | 
| 
       6 
7 
     | 
    
         
             
            require 'yaml'
         
     | 
| 
       7 
8 
     | 
    
         
             
            require 'bar_worker'
         
     | 
| 
       8 
9 
     | 
    
         
             
            require 'baz_worker'
         
     | 
| 
       9 
10 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
            config = YAML. 
     | 
| 
       11 
     | 
    
         
            -
            ModernTimes:: 
     | 
| 
      
 11 
     | 
    
         
            +
            config = YAML.load(ERB.new(File.read(File.join(File.dirname(__FILE__), '..', 'jms.yml'))).result(binding))
         
     | 
| 
      
 12 
     | 
    
         
            +
            ModernTimes::JMS::Connection.init(config)
         
     | 
| 
       12 
13 
     | 
    
         | 
| 
       13 
14 
     | 
    
         
             
            manager = ModernTimes::Manager.new(:persist_file => 'modern_times.state')
         
     | 
| 
       14 
15 
     | 
    
         
             
            manager.stop_on_signal
         
     | 
    
        data/examples/simple/publish.rb
    CHANGED
    
    | 
         @@ -2,6 +2,7 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            require 'rubygems'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'erb'
         
     | 
| 
       5 
6 
     | 
    
         
             
            require 'modern_times'
         
     | 
| 
       6 
7 
     | 
    
         
             
            require 'yaml'
         
     | 
| 
       7 
8 
     | 
    
         
             
            require 'bar_worker'
         
     | 
| 
         @@ -15,13 +16,13 @@ bar_count = ARGV[0].to_i 
     | 
|
| 
       15 
16 
     | 
    
         
             
            baz_count = ARGV[1].to_i
         
     | 
| 
       16 
17 
     | 
    
         
             
            sleep_time = (ARGV[2] || 0.2).to_f
         
     | 
| 
       17 
18 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
            config = YAML. 
     | 
| 
       19 
     | 
    
         
            -
            ModernTimes:: 
     | 
| 
       20 
     | 
    
         
            -
            bar_publisher = ModernTimes:: 
     | 
| 
       21 
     | 
    
         
            -
            baz_publisher = ModernTimes:: 
     | 
| 
      
 19 
     | 
    
         
            +
            config = YAML.load(ERB.new(File.read(File.join(File.dirname(__FILE__), '..', 'jms.yml'))).result(binding))
         
     | 
| 
      
 20 
     | 
    
         
            +
            ModernTimes::JMS::Connection.init(config)
         
     | 
| 
      
 21 
     | 
    
         
            +
            bar_publisher = ModernTimes::JMS::Publisher.new(:queue_name => 'Bar', :marshal => :bson)
         
     | 
| 
      
 22 
     | 
    
         
            +
            baz_publisher = ModernTimes::JMS::Publisher.new(:queue_name => 'Baz', :marshal => :string)
         
     | 
| 
       22 
23 
     | 
    
         | 
| 
       23 
24 
     | 
    
         
             
            (1..bar_count).each do |i|
         
     | 
| 
       24 
     | 
    
         
            -
              obj = { 
     | 
| 
      
 25 
     | 
    
         
            +
              obj = {'message' => i}
         
     | 
| 
       25 
26 
     | 
    
         
             
              puts "Publishing to Bar object: #{obj.inspect}"
         
     | 
| 
       26 
27 
     | 
    
         
             
              bar_publisher.publish(obj)
         
     | 
| 
       27 
28 
     | 
    
         
             
              sleep sleep_time
         
     | 
    
        data/lib/modern_times.rb
    CHANGED
    
    | 
         @@ -1,8 +1,9 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'rubygems'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'modern_times/exception'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'modern_times/marshal_strategy'
         
     | 
| 
       3 
4 
     | 
    
         
             
            require 'modern_times/base'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'modern_times/ 
     | 
| 
       5 
     | 
    
         
            -
            require 'modern_times/ 
     | 
| 
      
 5 
     | 
    
         
            +
            require 'modern_times/jms'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'modern_times/jms_requestor'
         
     | 
| 
       6 
7 
     | 
    
         
             
            require 'modern_times/manager_mbean'
         
     | 
| 
       7 
8 
     | 
    
         
             
            require 'modern_times/manager'
         
     | 
| 
       8 
9 
     | 
    
         
             
            require 'modern_times/loggable'
         
     | 
| 
         @@ -11,4 +12,21 @@ require 'modern_times/railsable' 
     | 
|
| 
       11 
12 
     | 
    
         
             
            module ModernTimes
         
     | 
| 
       12 
13 
     | 
    
         
             
              extend ModernTimes::Loggable
         
     | 
| 
       13 
14 
     | 
    
         
             
              extend ModernTimes::Railsable
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              DEFAULT_DOMAIN = 'ModernTimes'
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              def self.manager_mbean_name(domain)
         
     | 
| 
      
 19 
     | 
    
         
            +
                domain = DEFAULT_DOMAIN unless domain
         
     | 
| 
      
 20 
     | 
    
         
            +
                "#{domain}.Manager"
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              def self.manager_mbean_object_name(domain)
         
     | 
| 
      
 24 
     | 
    
         
            +
                domain = DEFAULT_DOMAIN unless domain
         
     | 
| 
      
 25 
     | 
    
         
            +
                "#{domain}:type=Manager"
         
     | 
| 
      
 26 
     | 
    
         
            +
              end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
              def self.supervisor_mbean_object_name(domain, worker_name)
         
     | 
| 
      
 29 
     | 
    
         
            +
                domain = DEFAULT_DOMAIN unless domain
         
     | 
| 
      
 30 
     | 
    
         
            +
                "#{domain}:worker=#{worker_name},type=Worker"
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
       14 
32 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module ModernTimes
         
     | 
| 
       2 
2 
     | 
    
         
             
              module Base
         
     | 
| 
       3 
3 
     | 
    
         
             
                class Supervisor
         
     | 
| 
       4 
     | 
    
         
            -
                  attr_reader :manager, :worker_klass, :name, :worker_options
         
     | 
| 
      
 4 
     | 
    
         
            +
                  attr_reader :manager, :worker_klass, :name, :worker_options, :workers
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
                  # Create new supervisor to manage a number of similar workers
         
     | 
| 
       7 
7 
     | 
    
         
             
                  # supervisor_options are those options defined on the Worker's Supervisor line
         
     | 
| 
         @@ -10,7 +10,7 @@ module ModernTimes 
     | 
|
| 
       10 
10 
     | 
    
         
             
                    @stopped        = false
         
     | 
| 
       11 
11 
     | 
    
         
             
                    @manager        = manager
         
     | 
| 
       12 
12 
     | 
    
         
             
                    @worker_klass   = worker_klass
         
     | 
| 
       13 
     | 
    
         
            -
                    @name           = worker_options 
     | 
| 
      
 13 
     | 
    
         
            +
                    @name           = worker_options[:name] || worker_klass.default_name
         
     | 
| 
       14 
14 
     | 
    
         
             
                    @worker_options = worker_options
         
     | 
| 
       15 
15 
     | 
    
         
             
                    @workers        = []
         
     | 
| 
       16 
16 
     | 
    
         
             
                    @worker_mutex   = Mutex.new
         
     | 
| 
         @@ -29,14 +29,13 @@ module ModernTimes 
     | 
|
| 
       29 
29 
     | 
    
         
             
                      if curr_count < count
         
     | 
| 
       30 
30 
     | 
    
         
             
                        (curr_count...count).each do |index|
         
     | 
| 
       31 
31 
     | 
    
         
             
                          worker = @worker_klass.new(@worker_options)
         
     | 
| 
       32 
     | 
    
         
            -
                          worker.supervisor = self
         
     | 
| 
       33 
32 
     | 
    
         
             
                          worker.index = index
         
     | 
| 
       34 
33 
     | 
    
         
             
                          if index == 0
         
     | 
| 
       35 
34 
     | 
    
         
             
                            # HornetQ hack:  If I create the session in the jmx thread, it dies with no feedback
         
     | 
| 
       36 
     | 
    
         
            -
                            tmp_thread = Thread.new do
         
     | 
| 
      
 35 
     | 
    
         
            +
                            #tmp_thread = Thread.new do
         
     | 
| 
       37 
36 
     | 
    
         
             
                              worker.setup
         
     | 
| 
       38 
     | 
    
         
            -
                            end
         
     | 
| 
       39 
     | 
    
         
            -
                            tmp_thread.join
         
     | 
| 
      
 37 
     | 
    
         
            +
                            #end
         
     | 
| 
      
 38 
     | 
    
         
            +
                            #tmp_thread.join
         
     | 
| 
       40 
39 
     | 
    
         
             
                          end
         
     | 
| 
       41 
40 
     | 
    
         
             
                          worker.thread = Thread.new do
         
     | 
| 
       42 
41 
     | 
    
         
             
                            #ModernTimes.logger.debug "#{worker}: Started thread with priority #{Thread.current.priority}"
         
     | 
| 
         @@ -53,8 +52,8 @@ module ModernTimes 
     | 
|
| 
       53 
52 
     | 
    
         
             
                    end
         
     | 
| 
       54 
53 
     | 
    
         
             
                  end
         
     | 
| 
       55 
54 
     | 
    
         | 
| 
       56 
     | 
    
         
            -
                  def  
     | 
| 
       57 
     | 
    
         
            -
                    @workers 
     | 
| 
      
 55 
     | 
    
         
            +
                  def worker_statuses
         
     | 
| 
      
 56 
     | 
    
         
            +
                    @workers.map { |w| w.status }
         
     | 
| 
       58 
57 
     | 
    
         
             
                  end
         
     | 
| 
       59 
58 
     | 
    
         | 
| 
       60 
59 
     | 
    
         
             
                  def stop
         
     | 
| 
         @@ -76,22 +75,16 @@ module ModernTimes 
     | 
|
| 
       76 
75 
     | 
    
         | 
| 
       77 
76 
     | 
    
         
             
                  end
         
     | 
| 
       78 
77 
     | 
    
         | 
| 
       79 
     | 
    
         
            -
                  def  
     | 
| 
       80 
     | 
    
         
            -
            # 
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
            # 
     | 
| 
       85 
     | 
    
         
            -
                    # TODO: This is nasty but I'm not sure how to create a dynamic class method within a scope
         
     | 
| 
       86 
     | 
    
         
            -
                    eval <<-EOS
         
     | 
| 
       87 
     | 
    
         
            -
                      def self.create_mbean(domain, supervisor, worker_klass)
         
     | 
| 
       88 
     | 
    
         
            -
                        #{klass.name}.new("\#{domain}.Worker.\#{worker_klass.name}", "Supervisor for \#{worker_klass.name}", supervisor, #{options.inspect})
         
     | 
| 
       89 
     | 
    
         
            -
                      end
         
     | 
| 
       90 
     | 
    
         
            -
                    EOS
         
     | 
| 
      
 78 
     | 
    
         
            +
                  def mbean_name(domain)
         
     | 
| 
      
 79 
     | 
    
         
            +
                    "#{domain}.Worker.#{@name}"
         
     | 
| 
      
 80 
     | 
    
         
            +
                  end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                  def mbean_description
         
     | 
| 
      
 83 
     | 
    
         
            +
                    "Supervisor for #{@worker_klass.name} under #{@name}"
         
     | 
| 
       91 
84 
     | 
    
         
             
                  end
         
     | 
| 
       92 
85 
     | 
    
         | 
| 
       93 
86 
     | 
    
         
             
                  def create_mbean(domain)
         
     | 
| 
       94 
     | 
    
         
            -
                     
     | 
| 
      
 87 
     | 
    
         
            +
                    SupervisorMBean.new(mbean_name(domain), mbean_description, self, {})
         
     | 
| 
       95 
88 
     | 
    
         
             
                  end
         
     | 
| 
       96 
89 
     | 
    
         | 
| 
       97 
90 
     | 
    
         
             
                  #########
         
     | 
| 
         @@ -3,8 +3,9 @@ require 'jmx' 
     | 
|
| 
       3 
3 
     | 
    
         
             
            module ModernTimes
         
     | 
| 
       4 
4 
     | 
    
         
             
              module Base
         
     | 
| 
       5 
5 
     | 
    
         
             
                class SupervisorMBean < RubyDynamicMBean
         
     | 
| 
       6 
     | 
    
         
            -
                  attr_reader 
     | 
| 
      
 6 
     | 
    
         
            +
                  attr_reader  :supervisor
         
     | 
| 
       7 
7 
     | 
    
         
             
                  rw_attribute :worker_count, :int, "Number of workers"
         
     | 
| 
      
 8 
     | 
    
         
            +
                  r_attribute  :worker_statuses, :list, 'Status of the workers'
         
     | 
| 
       8 
9 
     | 
    
         | 
| 
       9 
10 
     | 
    
         
             
                  def initialize(name, description, supervisor, options)
         
     | 
| 
       10 
11 
     | 
    
         
             
                    super(name, description)
         
     | 
| 
         @@ -19,11 +20,8 @@ module ModernTimes 
     | 
|
| 
       19 
20 
     | 
    
         
             
                    supervisor.worker_count = count
         
     | 
| 
       20 
21 
     | 
    
         
             
                  end
         
     | 
| 
       21 
22 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
                   
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                  returns :string
         
     | 
| 
       25 
     | 
    
         
            -
                  def worker_status(index)
         
     | 
| 
       26 
     | 
    
         
            -
                    supervisor.worker_status(index)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  def worker_statuses
         
     | 
| 
      
 24 
     | 
    
         
            +
                    java.util.ArrayList.new(supervisor.worker_statuses)
         
     | 
| 
       27 
25 
     | 
    
         
             
                  end
         
     | 
| 
       28 
26 
     | 
    
         
             
                end
         
     | 
| 
       29 
27 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1,36 +1,32 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'json'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
1 
     | 
    
         
             
            module ModernTimes
         
     | 
| 
       4 
2 
     | 
    
         
             
              module Base
         
     | 
| 
       5 
     | 
    
         
            -
                 
     | 
| 
       6 
     | 
    
         
            -
                  attr_accessor : 
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                   
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                     
     | 
| 
       17 
     | 
    
         
            -
                      def self.create_supervisor(manager, worker_options)
         
     | 
| 
       18 
     | 
    
         
            -
                        #{klass.name}.new(manager, self, #{options.to_json}, worker_options)
         
     | 
| 
       19 
     | 
    
         
            -
                      end
         
     | 
| 
       20 
     | 
    
         
            -
                    EOS
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Worker
         
     | 
| 
      
 4 
     | 
    
         
            +
                  attr_accessor :name, :index, :thread
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                  module ClassMethods
         
     | 
| 
      
 7 
     | 
    
         
            +
                    def default_name
         
     | 
| 
      
 8 
     | 
    
         
            +
                      name = self.name.sub(/Worker$/, '')
         
     | 
| 
      
 9 
     | 
    
         
            +
                      name.sub(/::/, '_')
         
     | 
| 
      
 10 
     | 
    
         
            +
                    end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                    def create_supervisor(manager, worker_options)
         
     | 
| 
      
 13 
     | 
    
         
            +
                      Supervisor.new(manager, self, {}, worker_options)
         
     | 
| 
      
 14 
     | 
    
         
            +
                    end
         
     | 
| 
       21 
15 
     | 
    
         
             
                  end
         
     | 
| 
       22 
16 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
                   
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
      
 17 
     | 
    
         
            +
                  def self.included(base)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    base.extend(ClassMethods)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
       25 
20 
     | 
    
         | 
| 
       26 
21 
     | 
    
         
             
                  def initialize(opts={})
         
     | 
| 
      
 22 
     | 
    
         
            +
                    @name = opts[:name] || self.class.default_name
         
     | 
| 
       27 
23 
     | 
    
         
             
                  end
         
     | 
| 
       28 
24 
     | 
    
         | 
| 
       29 
25 
     | 
    
         
             
                  # One time initialization prior to first thread
         
     | 
| 
       30 
26 
     | 
    
         
             
                  def setup
         
     | 
| 
       31 
27 
     | 
    
         
             
                  end
         
     | 
| 
       32 
28 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
                  def start
         
     | 
| 
      
 29 
     | 
    
         
            +
                  def start(name)
         
     | 
| 
       34 
30 
     | 
    
         
             
                    raise "Need to override start method in #{self.class.name}"
         
     | 
| 
       35 
31 
     | 
    
         
             
                  end
         
     | 
| 
       36 
32 
     | 
    
         | 
| 
         @@ -41,11 +37,6 @@ module ModernTimes 
     | 
|
| 
       41 
37 
     | 
    
         
             
                  def status
         
     | 
| 
       42 
38 
     | 
    
         
             
                    raise "Need to override status method in #{self.class.name}"
         
     | 
| 
       43 
39 
     | 
    
         
             
                  end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                  def self.default_name
         
     | 
| 
       46 
     | 
    
         
            -
                    name = self.name.sub(/Worker$/, '')
         
     | 
| 
       47 
     | 
    
         
            -
                    name.sub(/::/, '_')
         
     | 
| 
       48 
     | 
    
         
            -
                  end
         
     | 
| 
       49 
40 
     | 
    
         
             
                end
         
     | 
| 
       50 
41 
     | 
    
         
             
              end
         
     | 
| 
       51 
42 
     | 
    
         
             
            end
         
     |