backgroundrb-rails3 1.1

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.
Files changed (126) hide show
  1. data/.autotest +17 -0
  2. data/ChangeLog +50 -0
  3. data/Gemfile +11 -0
  4. data/LICENSE +4 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README +22 -0
  7. data/Rakefile +128 -0
  8. data/TODO.org +5 -0
  9. data/app/controller/backgroundrb_status_controller.rb +6 -0
  10. data/backgroundrb-rails3.gemspec +219 -0
  11. data/config/backgroundrb.yml +11 -0
  12. data/doc/Rakefile +5 -0
  13. data/doc/config.yaml +2 -0
  14. data/doc/content/advanced/advanced.txt +76 -0
  15. data/doc/content/advanced/advanced.yaml +4 -0
  16. data/doc/content/bugs/bugs.txt +20 -0
  17. data/doc/content/bugs/bugs.yaml +5 -0
  18. data/doc/content/community/community.txt +36 -0
  19. data/doc/content/community/community.yaml +5 -0
  20. data/doc/content/content.txt +168 -0
  21. data/doc/content/content.yaml +5 -0
  22. data/doc/content/faq/faq.txt +41 -0
  23. data/doc/content/faq/faq.yaml +5 -0
  24. data/doc/content/rails/rails.txt +182 -0
  25. data/doc/content/rails/rails.yaml +5 -0
  26. data/doc/content/scheduling/scheduling.txt +166 -0
  27. data/doc/content/scheduling/scheduling.yaml +5 -0
  28. data/doc/content/workers/workers.txt +178 -0
  29. data/doc/content/workers/workers.yaml +5 -0
  30. data/doc/layouts/default/default.erb +56 -0
  31. data/doc/layouts/default/default.yaml +4 -0
  32. data/doc/lib/default.rb +7 -0
  33. data/doc/output/Assets/BG-Ad-Top.png +0 -0
  34. data/doc/output/Assets/BG-Body.png +0 -0
  35. data/doc/output/Assets/BG-Feed.png +0 -0
  36. data/doc/output/Assets/BG-Menu-Hover.png +0 -0
  37. data/doc/output/Assets/BG-Menu.png +0 -0
  38. data/doc/output/Assets/BG-Sidebar-Bottom.png +0 -0
  39. data/doc/output/Assets/Button-Feed.png +0 -0
  40. data/doc/output/images/bg-ad-top.png +0 -0
  41. data/doc/output/images/bg-body.png +0 -0
  42. data/doc/output/images/bg-feed.gif +0 -0
  43. data/doc/output/images/bg-footer.jpg +0 -0
  44. data/doc/output/images/bg-header.jpg +0 -0
  45. data/doc/output/images/bg-menu-hover.png +0 -0
  46. data/doc/output/images/bg-menu.png +0 -0
  47. data/doc/output/images/bg-sidebar-bottom.gif +0 -0
  48. data/doc/output/images/button-feed.png +0 -0
  49. data/doc/output/images/icon-comment.png +0 -0
  50. data/doc/output/images/more_icon.gif +0 -0
  51. data/doc/output/style.css +299 -0
  52. data/doc/page_defaults.yaml +13 -0
  53. data/doc/tasks/default.rake +3 -0
  54. data/doc/templates/default/default.txt +1 -0
  55. data/doc/templates/default/default.yaml +4 -0
  56. data/examples/backgroundrb.yml +25 -0
  57. data/examples/foo_controller.rb +48 -0
  58. data/examples/god_worker.rb +7 -0
  59. data/examples/worker_tests/god_worker_test.rb +8 -0
  60. data/examples/workers/error_worker.rb +17 -0
  61. data/examples/workers/foo_worker.rb +38 -0
  62. data/examples/workers/god_worker.rb +7 -0
  63. data/examples/workers/model_worker.rb +13 -0
  64. data/examples/workers/renewal_worker.rb +11 -0
  65. data/examples/workers/rss_worker.rb +26 -0
  66. data/examples/workers/server_worker.rb +31 -0
  67. data/examples/workers/world_worker.rb +12 -0
  68. data/examples/workers/xmpp_worker.rb +7 -0
  69. data/init.rb +7 -0
  70. data/install.rb +1 -0
  71. data/know_issues.org +5 -0
  72. data/lib/backgroundrb.rb +1 -0
  73. data/lib/backgroundrb/bdrb_client_helper.rb +8 -0
  74. data/lib/backgroundrb/bdrb_cluster_connection.rb +156 -0
  75. data/lib/backgroundrb/bdrb_config.rb +43 -0
  76. data/lib/backgroundrb/bdrb_conn_error.rb +29 -0
  77. data/lib/backgroundrb/bdrb_connection.rb +179 -0
  78. data/lib/backgroundrb/bdrb_job_queue.rb +79 -0
  79. data/lib/backgroundrb/bdrb_result.rb +19 -0
  80. data/lib/backgroundrb/bdrb_start_stop.rb +146 -0
  81. data/lib/backgroundrb/rails_worker_proxy.rb +181 -0
  82. data/lib/backgroundrb/railtie.rb +48 -0
  83. data/lib/generators/backgroundrb/bdrb_migration/USAGE +12 -0
  84. data/lib/generators/backgroundrb/bdrb_migration/bdrb_migration_generator.rb +15 -0
  85. data/lib/generators/backgroundrb/bdrb_migration/templates/migration.rb +27 -0
  86. data/lib/generators/backgroundrb/worker/USAGE +16 -0
  87. data/lib/generators/backgroundrb/worker/templates/unit_test.rb +12 -0
  88. data/lib/generators/backgroundrb/worker/templates/worker.rb +7 -0
  89. data/lib/generators/backgroundrb/worker/worker_generator.rb +14 -0
  90. data/lib/tasks/backgroundrb_tasks.rake +103 -0
  91. data/release_notes.org +48 -0
  92. data/release_points.org +46 -0
  93. data/script/backgroundrb +52 -0
  94. data/script/bdrb_test_helper.rb +99 -0
  95. data/script/load_worker_env.rb +31 -0
  96. data/script/monitrc +25 -0
  97. data/server/backgroundrb_server.rb +12 -0
  98. data/server/lib/bdrb_result_storage.rb +62 -0
  99. data/server/lib/bdrb_server_helper.rb +24 -0
  100. data/server/lib/bdrb_thread_pool.rb +127 -0
  101. data/server/lib/cron_trigger.rb +197 -0
  102. data/server/lib/invalid_dump_error.rb +4 -0
  103. data/server/lib/log_worker.rb +25 -0
  104. data/server/lib/master_proxy.rb +140 -0
  105. data/server/lib/master_worker.rb +187 -0
  106. data/server/lib/meta_worker.rb +432 -0
  107. data/server/lib/trigger.rb +34 -0
  108. data/test/bdrb_client_test_helper.rb +5 -0
  109. data/test/bdrb_test_helper.rb +35 -0
  110. data/test/client/backgroundrb.yml +17 -0
  111. data/test/client/test_bdrb_client_helper.rb +13 -0
  112. data/test/client/test_bdrb_cluster_connection.rb +162 -0
  113. data/test/client/test_bdrb_config.rb +20 -0
  114. data/test/client/test_bdrb_connection.rb +29 -0
  115. data/test/client/test_bdrb_job_queue.rb +63 -0
  116. data/test/client/test_worker_proxy.rb +130 -0
  117. data/test/server/test_cron_trigger.rb +281 -0
  118. data/test/server/test_master_proxy.rb +54 -0
  119. data/test/server/test_master_worker.rb +157 -0
  120. data/test/server/test_meta_worker.rb +281 -0
  121. data/test/server/test_result_storage.rb +14 -0
  122. data/test/socket_mocker.rb +34 -0
  123. data/test/workers/bar_worker.rb +10 -0
  124. data/test/workers/foo_worker.rb +10 -0
  125. data/uninstall.rb +1 -0
  126. metadata +345 -0
@@ -0,0 +1,12 @@
1
+ Description:
2
+ Creates a migration to add the job queue table used by BackgrounDRb.
3
+ Pass the migration name, either CamelCased or under_scored, as an argument.
4
+
5
+ Example:
6
+ rails generate backgroundrb:bdrb_migration BackgroundrbJob
7
+
8
+ Assuming this is run at 09:00:15h on 12 September, 2008, this will create the
9
+ CreateBackgroundrbQueue migration in:
10
+
11
+ db/migrate/20080912090015_backgroundrb_create_backgroundrb_jobs.rb
12
+
@@ -0,0 +1,15 @@
1
+ require 'rails/generators/active_record'
2
+
3
+ module Backgroundrb
4
+ module Generators
5
+ class BdrbMigrationGenerator < ActiveRecord::Generators::Base
6
+ def self.source_root
7
+ @source_root ||= File.expand_path('../templates', __FILE__)
8
+ end
9
+
10
+ def copy_backgroundrb_migration
11
+ migration_template "migration.rb", "db/migrate/backgroundrb_create_#{table_name}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ class BackgroundrbCreate<%= table_name.camelize %> < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :<%= table_name %> do |t|
4
+ t.column :args, :text
5
+ t.column :worker_name, :string
6
+ t.column :worker_method, :string
7
+ t.column :job_key, :string
8
+ t.column :taken, :int
9
+ t.column :finished, :int
10
+ t.column :timeout, :int
11
+ t.column :priority, :int
12
+ t.column :submitted_at, :datetime
13
+ t.column :started_at, :datetime
14
+ t.column :finished_at, :datetime
15
+ t.column :archived_at, :datetime
16
+ t.column :tag, :string
17
+ t.column :submitter_info, :string
18
+ t.column :runner_info, :string
19
+ t.column :worker_key, :string
20
+ t.column :scheduled_at, :datetime
21
+ end
22
+ end
23
+
24
+ def self.down
25
+ drop_table :<%= table_name %>
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ Description:
2
+ The worker generator creates stubs for a new BackgrounDRb worker.
3
+
4
+ The generator takes a worker name as its argument. The worker name may be
5
+ given in CamelCase or under_score and should not be suffixed with 'Worker'.
6
+
7
+ The generator creates a worker class in lib/workers and a test suite in
8
+ test/unit.
9
+
10
+ Example:
11
+ ./script/generate backgroundrb:worker Tail
12
+
13
+ This will create an Tail worker:
14
+ Model: lib/workers/tail_worker.rb
15
+ Test: test/unit/tail_worker_test.rb
16
+
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../test_helper'
2
+ require "#{RAILS_ROOT}/lib/workers/<%= file_name %>_worker"
3
+ require "#{RAILS_ROOT}/vendor/plugins/backgroundrb/lib/backgroundrb.rb"
4
+ require 'drb'
5
+
6
+ class <%= class_name %>WorkerTest < Test::Unit::TestCase
7
+
8
+ # Replace this with your real tests.
9
+ def test_truth
10
+ assert <%= class_name %>Worker.included_modules.include?(DRbUndumped)
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ class <%= file_name.camelize %>Worker < BackgrounDRb::MetaWorker
2
+ set_worker_name :<%= file_name.underscore %>_worker
3
+ def create(args = nil)
4
+ # this method is called, when worker is loaded for the first time
5
+ end
6
+ end
7
+
@@ -0,0 +1,14 @@
1
+ module Backgroundrb
2
+ module Generators
3
+ class WorkerGenerator < Rails::Generators::NamedBase
4
+ def self.source_root
5
+ @source_root ||= File.expand_path('../templates', __FILE__)
6
+ end
7
+
8
+ def copy_backgroundrb_worker
9
+ template "worker.rb", "lib/workers/#{file_name}_worker.rb"
10
+ #template "unit_test.rb", "test/unit/#{file_name}_worker_test.rb"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,103 @@
1
+ namespace :backgroundrb do
2
+ require 'yaml'
3
+ desc 'Setup backgroundrb in your rails application'
4
+ task :setup do
5
+ script_dest = "#{Rails.root}/script/backgroundrb"
6
+ script_src = File.dirname(__FILE__) + "/../../script/backgroundrb"
7
+
8
+ FileUtils.chmod 0774, script_src
9
+
10
+ defaults = {:backgroundrb => {:ip => '0.0.0.0',:port => 11006 } }
11
+
12
+ config_dest = "#{Rails.root}/config/backgroundrb.yml"
13
+
14
+ unless File.exists?(config_dest)
15
+ puts "Copying backgroundrb.yml config file to #{config_dest}"
16
+ File.open(config_dest, 'w') { |f| f.write(YAML.dump(defaults)) }
17
+ end
18
+
19
+ unless File.exists?(script_dest)
20
+ puts "Copying backgroundrb script to #{script_dest}"
21
+ FileUtils.cp_r(script_src, script_dest)
22
+ end
23
+
24
+ workers_dest = "#{Rails.root}/lib/workers"
25
+ unless File.exists?(workers_dest)
26
+ puts "Creating #{workers_dest}"
27
+ FileUtils.mkdir(workers_dest)
28
+ end
29
+
30
+ test_helper_dest = "#{Rails.root}/test/bdrb_test_helper.rb"
31
+ test_helper_src = File.dirname(__FILE__) + "/../../script/bdrb_test_helper.rb"
32
+ unless File.exists?(test_helper_dest)
33
+ puts "Copying Worker Test helper file #{test_helper_dest}"
34
+ FileUtils.cp_r(test_helper_src,test_helper_dest)
35
+ end
36
+
37
+ worker_env_loader_dest = "#{Rails.root}/script/load_worker_env.rb"
38
+ worker_env_loader_src = File.join(File.dirname(__FILE__),"../../","script","load_worker_env.rb")
39
+ unless File.exists? worker_env_loader_dest
40
+ puts "Copying Worker envionment loader file #{worker_env_loader_dest}"
41
+ FileUtils.cp_r(worker_env_loader_src,worker_env_loader_dest)
42
+ end
43
+
44
+ unless File.exists? "#{Rails.root}/tmp/pids"
45
+ puts "Creating tmp/pids directory"
46
+ Dir.mkdir "#{Rails.root}/tmp/pids"
47
+ end
48
+
49
+ # Generate the migration
50
+ Rake::Task['backgroundrb:queue_migration'].invoke
51
+ end
52
+
53
+ desc "Drops and recreate backgroundrb queue table"
54
+ task :redo_queue => :queue_migration do
55
+ end
56
+
57
+ desc 'update backgroundrb config files from your rails application'
58
+ task :update do
59
+ temp_scripts = ["backgroundrb","load_worker_env.rb"].map {|x| "#{Rails.root}/script/#{x}"}
60
+ temp_scripts.each do |file_name|
61
+ if File.exists?(file_name)
62
+ puts "Removing #{file_name} ..."
63
+ FileUtils.rm(file_name,:force => true)
64
+ end
65
+ end
66
+ new_temp_scripts = ["backgroundrb","load_worker_env.rb"].map {|x| File.dirname(__FILE__) + "/../../script/#{x}" }
67
+ new_temp_scripts.each do |file_name|
68
+ puts "Updating file #{File.expand_path(file_name)} ..."
69
+ FileUtils.cp_r(file_name,"#{Rails.root}/script/")
70
+ end
71
+ end
72
+
73
+ desc 'Generate a migration for the backgroundrb queue table. The migration name can be ' +
74
+ 'specified with the MIGRATION environment variable.'
75
+ task :queue_migration => :environment do
76
+ raise "Task unavailable to this database (no migration support)" unless ActiveRecord::Base.connection.supports_migrations?
77
+ require 'rails/generators'
78
+ Rails::Generators::invoke('backgroundrb:bdrb_migration', ENV['MIGRATION'] || 'BackgroundrbJob')
79
+ end
80
+
81
+ desc 'Remove backgroundrb from your rails application'
82
+ task :remove do
83
+ script_src = "#{Rails.root}/script/backgroundrb"
84
+ temp_scripts = ["backgroundrb","load_worker_env.rb"].map {|x| "#{Rails.root}/script/#{x}"}
85
+
86
+ if File.exists?(script_src)
87
+ puts "Removing #{script_src} ..."
88
+ FileUtils.rm(script_src, :force => true)
89
+ end
90
+
91
+ test_helper_src = "#{Rails.root}/test/bdrb_test_helper.rb"
92
+ if File.exists?(test_helper_src)
93
+ puts "Removing backgroundrb test helper.."
94
+ FileUtils.rm(test_helper_src,:force => true)
95
+ end
96
+
97
+ workers_dest = "#{Rails.root}/lib/workers"
98
+ if File.exists?(workers_dest) && Dir.entries("#{workers_dest}").size == 2
99
+ puts "#{workers_dest} is empty...deleting!"
100
+ FileUtils.rmdir(workers_dest)
101
+ end
102
+ end
103
+ end
data/release_notes.org ADDED
@@ -0,0 +1,48 @@
1
+ Hi,
2
+
3
+ BackgrounDRb 1.2 is being unleashed.
4
+
5
+ * New features:
6
+
7
+ ** Exceptions/errors are now popped out at the earliest moment
8
+ in the client side itself. For example:
9
+
10
+ >> MiddleMan.worker(:foo_worker).async_bar(:args => {:age => 10})
11
+ BackgrounDRb::RemoteWorkerError: BackgrounDRb::RemoteWorkerError
12
+
13
+ Above exception is thrown because remote worker doesn't have method
14
+ "bar" defined on it.
15
+
16
+ Similarly:
17
+
18
+ >> MiddleMan.worker(:foo_worker).checksum(:args => {:age => "lolz"})
19
+ BackgrounDRb::RemoteWorkerError: BackgrounDRb::RemoteWorkerError
20
+
21
+ Above exception is thrown because remote worker's checksum method
22
+ expects an integer as an argument.
23
+
24
+ For asynchronous method calls, BackgrounDRb doesn't check if method
25
+ ran successfully, it only checks existence of methods on remote
26
+ worker. For sync method calls it checks if method ran successfully
27
+ or not.
28
+
29
+ ** Its possible to have per worker configuration options now.
30
+
31
+ * Bug Fixes
32
+
33
+ ** Much better error/exception handling. Rogue worker methods shouldn't
34
+ crash the worker now. All the unhandled exceptions and dispatch
35
+ errors can be found in debug log file.
36
+
37
+ ** Fixes for postgres db with persistent job queues.
38
+
39
+ ** Switched to lightweight Queue implementation for tasks enqueued
40
+ to thread pool.
41
+
42
+ ** Fixes for database dropped connections while running tasks from
43
+ persistent queues.
44
+
45
+ ** Fixes for newer Rails versions.
46
+
47
+ **
48
+
@@ -0,0 +1,46 @@
1
+ * Before publishing any release, please make sure that following things are working *
2
+ ** Scheduling via cron is working
3
+ ** Scheduling via unix scheduler is working
4
+ ** creating a worker using job_key is working
5
+ ** Creating a worker and its scheduling is working
6
+ ** ask_work is working => check
7
+ ** send_request is working => check
8
+ ** all_worker_info is workign
9
+ ** status retrieval is working => check
10
+ ** sending of large objects around is working
11
+ ** sending of rails AR objects is working
12
+ ** sending of rails AR objects with plugin is working
13
+ ** Environment is getting loaded properly through config file and command line argument.
14
+ ** People are unable to call ActionController methods.
15
+ ** People should be able to use multiple args while invoking methods.
16
+ ** Check if clustering is working.
17
+ ** Check if queue is working.
18
+
19
+ * Problem with new experimental API
20
+ ** there is an issue if user invokes multiple tasks in thread pool directly from one of the worker
21
+ under current settings they are going to end up with same job key.
22
+
23
+ ** Also, new_worker can't have same method invocation conventions because it accepts more parameters.
24
+
25
+ * Ideas
26
+ ** Okay, use:
27
+ cache[job_key] = result
28
+ cache[job_key] =>
29
+ will return the result. worker_name, worker_key shall be taken in to account.
30
+
31
+ ** Write a Rails controller that returns following information:
32
+ - For each BackgrounDRb server:
33
+ - Workers running
34
+ - Memory taken by them
35
+ - Number of threads in thread pool
36
+ - Number of Tasks in Queue
37
+ - If any worker key
38
+ - Perhaps a count of open file descriptors
39
+ - Scheduled tasks and next turn
40
+ - Overall memory taken by entire BackgrounDRb server.
41
+
42
+
43
+
44
+
45
+
46
+
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ RAILS_HOME = File.expand_path(File.join(File.dirname(__FILE__),".."))
4
+
5
+ require "rubygems"
6
+ require "active_support"
7
+ require "active_record"
8
+
9
+ require RAILS_HOME + "/config/boot"
10
+ require "backgroundrb"
11
+
12
+ BDRB_HOME = ::BackgrounDRb::BACKGROUNDRB_ROOT
13
+ WORKER_ROOT = File.join(RAILS_HOME,"lib","workers")
14
+ WORKER_LOAD_ENV = File.join(RAILS_HOME,"script","load_worker_env")
15
+
16
+ ["server","server/lib","lib","lib/backgroundrb"].each { |x| $LOAD_PATH.unshift(BDRB_HOME + "/#{x}")}
17
+ $LOAD_PATH.unshift(WORKER_ROOT)
18
+
19
+ require "bdrb_config"
20
+
21
+ BDRB_CONFIG = BackgrounDRb::Config.read_config("#{RAILS_HOME}/config/backgroundrb.yml")
22
+ PID_FILE = "#{RAILS_HOME}/tmp/pids/backgroundrb_#{BDRB_CONFIG[:backgroundrb][:port]}.pid"
23
+ SERVER_LOGGER = "#{RAILS_HOME}/log/backgroundrb_debug_#{BDRB_CONFIG[:backgroundrb][:port]}.log"
24
+
25
+ require "bdrb_start_stop"
26
+ daemon = BackgrounDRb::StartStop.new
27
+
28
+ case ARGV[0]
29
+ when 'start'; daemon.start
30
+ when 'stop'; daemon.stop
31
+ when 'restart'; daemon.stop;daemon.start
32
+ when 'status'
33
+ if daemon.running?
34
+ puts "BackgrounDRb Running"
35
+ exit
36
+ else
37
+ puts "BackgrounDRb Not Running"
38
+ exit!(daemon.status)
39
+ end
40
+ else
41
+ require "logger"
42
+ require "packet"
43
+ require "optparse"
44
+
45
+ BackgrounDRb::Config.parse_cmd_options ARGV
46
+
47
+ require RAILS_HOME + "/config/environment"
48
+ require "bdrb_job_queue"
49
+ require "backgroundrb_server"
50
+ BackgrounDRb::MasterProxy.new()
51
+ end
52
+
@@ -0,0 +1,99 @@
1
+ require File.join(File.dirname(__FILE__) + "/../config/environment")
2
+ WORKER_ROOT = RAILS_ROOT + "/lib/workers"
3
+ $LOAD_PATH.unshift(WORKER_ROOT)
4
+
5
+ class Object
6
+ def self.metaclass; class << self; self; end; end
7
+
8
+ def self.iattr_accessor *args
9
+ metaclass.instance_eval do
10
+ attr_accessor *args
11
+ args.each do |attr|
12
+ define_method("set_#{attr}") do |b_value|
13
+ self.send("#{attr}=",b_value)
14
+ end
15
+ end
16
+ end
17
+
18
+ args.each do |attr|
19
+ class_eval do
20
+ define_method(attr) do
21
+ self.class.send(attr)
22
+ end
23
+ define_method("#{attr}=") do |b_value|
24
+ self.class.send("#{attr}=",b_value)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ module BackgrounDRb
32
+ class WorkerDummyLogger
33
+ %w(info debug fatal error warn).each do |x|
34
+ define_method(x) do |log_data|
35
+ end
36
+ end
37
+ end
38
+
39
+ class WorkData
40
+ attr_accessor :args,:block,:job_method,:persistent_job_id,:job_key
41
+ def initialize(args,job_key,job_method,persistent_job_id)
42
+ @args = args
43
+ @job_key = job_key
44
+ @job_method = job_method
45
+ @persistent_job_id = persistent_job_id
46
+ end
47
+ end
48
+
49
+ class ThreadPool
50
+ attr_accessor :size,:threads,:work_queue,:logger
51
+ attr_accessor :result_queue,:master
52
+
53
+ def initialize(master,size)
54
+ @master = master
55
+ @logger = logger
56
+ @size = size
57
+ @threads = []
58
+ end
59
+
60
+ def defer(method_name,args = nil)
61
+ job_key = Thread.current[:job_key]
62
+ persistent_job_id = Thread.current[:persistent_job_id]
63
+ t = WorkData.new(args,job_key,method_name,persistent_job_id)
64
+ result = run_task(t)
65
+ result
66
+ end
67
+
68
+ # run tasks popped out of queue
69
+ def run_task task
70
+ block_arity = master.method(task.job_method).arity
71
+ begin
72
+ t_data = task.args
73
+ result = nil
74
+ if block_arity != 0
75
+ result = master.send(task.job_method,task.args)
76
+ else
77
+ result = master.send(task.job_method)
78
+ end
79
+ return result
80
+ rescue
81
+ puts($!.to_s)
82
+ puts($!.backtrace.join("\n"))
83
+ return nil
84
+ end
85
+ end
86
+ end #end of class ThreadPool
87
+
88
+ class MetaWorker
89
+ attr_accessor :logger,:thread_pool
90
+ iattr_accessor :worker_name
91
+ iattr_accessor :no_auto_load
92
+
93
+ def initialize
94
+ @logger = WorkerDummyLogger.new
95
+ @thread_pool = ThreadPool.new(self,10)
96
+ end
97
+ end
98
+ end
99
+