queue_dispatcher 1.3.1 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ Yzc0ZDM1ZDgzMzcwYjE4OTkyZDc1ZjU4N2VhNjc1NWI5ODk2MTFiZA==
5
+ data.tar.gz: !binary |-
6
+ NDZkODM3YTg3NTg1YjM4NDM2YzM2NDVjOGViZTc1MDFmYTU4NGUyNA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ODhlY2E5NTcyOTk3YTRmZTY2NDcwNTZjNDkxMjkyYmZiNTJkMWE3Njk4MGIw
10
+ MGIwY2U3YzdiNzE3ZmIwNDMyZGRjMTBlNmJjZGM3YWIwMzQyMWUzZTVlYWJh
11
+ ZmFjYjIxMTkwMjQwNzAzOTQzYzZiZDIyMjRhMjBjZjcwOTQ2YmU=
12
+ data.tar.gz: !binary |-
13
+ MWRiMTkwODU5YTNmY2Y1ZjFmYjJiMzZiNGYyOGQxYWVmYjM5Yzg2NGNhYjA4
14
+ ZGEwMTg5MTc3YmQ5MTUxMjM4NjhjNGMxOTgwMWQxMjY2YmFkNzFiNzMzZmRj
15
+ Y2VkZjVlZTA1ZWUzYThkYzhhZTg1ZDZiNmI3MTQ3Y2UzMzE0YzA=
data/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ .idea
data/README.rdoc CHANGED
@@ -1,5 +1,7 @@
1
1
  = QueueDispatcher for Rails3
2
2
 
3
+ {<img src="https://codeclimate.com/github/InWork/queue_dispatcher.png" />}[https://codeclimate.com/github/InWork/queue_dispatcher]
4
+
3
5
  This Rails3 Gem implements a method to perform long running methods in the background.
4
6
  Background tasks will be executed by persistent workers.
5
7
 
@@ -43,8 +43,10 @@ module QueueDispatcher
43
43
 
44
44
  def create_migration_file
45
45
  migration_template 'task_queues.rb', 'db/migrate/create_task_queues.rb'
46
- migration_template 'tasks.rb', 'db/migrate/create_tasks.rb'
47
46
  migration_template 'task_dependencies.rb', 'db/migrate/create_task_dependencies.rb'
47
+ migration_template 'change_message_type_for_tasks.rb', 'db/migrate/change_message_type_for_tasks.rb'
48
+ migration_template 'add_interrupts_to_tasks_queues.rb', 'db/migrate/add_interrupts_to_tasks_queues.rb'
49
+ migration_template 'add_result_to_tasks.rb', 'db/migrate/add_result_to_tasks.rb'
48
50
  end
49
51
 
50
52
  end
@@ -0,0 +1,9 @@
1
+ class AddInterruptsToTasksQueues < ActiveRecord::Migration
2
+ def up
3
+ add_column "<%= options[:task_queues_table_name] %>", :interrupts, :text
4
+ end
5
+
6
+ def down
7
+ remove_column "<%= options[:task_queues_table_name] %>", :interrupts, :string
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class AddResultToTasks < ActiveRecord::Migration
2
+ def up
3
+ add_column "<%= options[:tasks_table_name] %>", :result, :text
4
+ end
5
+
6
+ def down
7
+ remove_column "<%= options[:tasks_table_name] %>", :result, :text
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class ChangeMessageTypeForTasks < ActiveRecord::Migration
2
+ def up
3
+ change_column "<%= options[:tasks_table_name] %>", :message, :text
4
+ end
5
+
6
+ def down
7
+ change_column "<%= options[:tasks_table_name] %>", :message, :string
8
+ end
9
+ end
@@ -15,7 +15,7 @@ module QueueDispatcher
15
15
 
16
16
 
17
17
  module ClassMethods
18
- def acts_as_task args = {}
18
+ def acts_as_task(args = {})
19
19
  # Include number-helper for number_to_human_size method
20
20
  include ActionView::Helpers::NumberHelper
21
21
 
@@ -32,6 +32,7 @@ module QueueDispatcher
32
32
  validates_presence_of :target, :method_name, :state
33
33
  serialize :target
34
34
  serialize :args
35
+ serialize :result
35
36
 
36
37
  # Add dynamic associations to task_dependency and task_property according to the class name
37
38
  TaskDependency.instance_eval %Q{
@@ -64,29 +65,33 @@ module QueueDispatcher
64
65
 
65
66
 
66
67
  # This method updates the task state according to the return code of their corresponding command and removes it from the task_queue
67
- def update_state(rc_and_msg, remove_from_queue = false)
68
+ def update_state(result, remove_from_queue = false)
68
69
  rc = output = error_msg = nil
69
70
 
70
- if rc_and_msg.is_a?(QueueDispatcher::RcAndMsg)
71
- rc = rc_and_msg.rc
72
- output = rc_and_msg.output
73
- error_msg = rc_and_msg.error_msg
74
- elsif rc_and_msg.kind_of?(Hash)
75
- rc = rc_and_msg[:rc]
76
- output = rc_and_msg[:output]
77
- error_msg = rc_and_msg[:error_msg]
71
+ if result.methods.include?(:rc) && result.methods.include?(:output) && result.methods.include?(:error_msg)
72
+ rc = result.rc
73
+ output = result.output
74
+ error_msg = result.error_msg
75
+ result = nil
76
+ elsif result.kind_of?(Hash)
77
+ rc = result[:rc]
78
+ output = result[:output]
79
+ error_msg = result[:error_msg]
80
+ result = nil
78
81
  end
79
82
 
80
- output ||= ""
83
+ output ||= ''
81
84
 
82
85
  if rc.nil? || rc == 0
83
- self.update_attributes :state => "successful",
86
+ self.update_attributes :state => 'successful',
84
87
  :perc_finished => 100,
85
- :message => output.truncate(10256)
88
+ :message => output.truncate(10256),
89
+ :result => result
86
90
  else
87
- self.update_attributes :state => "error",
91
+ self.update_attributes :state => 'error',
88
92
  :error_msg => error_msg,
89
- :message => output.truncate(10256)
93
+ :message => output.truncate(10256),
94
+ :result => result
90
95
  end
91
96
 
92
97
  self.update_attributes :task_queue_id => nil if remove_from_queue
@@ -96,7 +101,7 @@ module QueueDispatcher
96
101
 
97
102
 
98
103
  # Update the attributes perc_finished and message according to the args
99
- def update_message args = {}
104
+ def update_message(args = {})
100
105
  msg = args[:msg]
101
106
  perc_finished = args[:perc_finished]
102
107
 
@@ -190,7 +195,7 @@ module QueueDispatcher
190
195
 
191
196
  # Calculate md5-Checksum
192
197
  def md5
193
- attr_str = ""
198
+ attr_str = ''
194
199
  Task.attribute_names.each{ |a| attr_str += self.send(a).to_s }
195
200
  Digest('MD5').digest(attr_str)
196
201
  end
@@ -32,7 +32,7 @@ module QueueDispatcher
32
32
 
33
33
 
34
34
  module ClassMethods
35
- def acts_as_task_queue args = {}
35
+ def acts_as_task_queue(args = {})
36
36
  include Spawn
37
37
  include ActionView::Helpers::UrlHelper
38
38
  include QdLogger
@@ -79,7 +79,7 @@ module QueueDispatcher
79
79
 
80
80
 
81
81
  # Find or create a task_queue by its name which is not in state 'error'. Create one, if there does not exists one
82
- def find_or_create_by_name name, options = {}
82
+ def find_or_create_by_name(name, options = {})
83
83
  transaction do
84
84
  self.where(:name => name).where("state != 'error'").first || self.create(:name => name, :state => 'new', terminate_immediately: options[:terminate_immediately])
85
85
  end
@@ -112,29 +112,29 @@ module QueueDispatcher
112
112
 
113
113
 
114
114
  # Put a new task into the queue
115
- def push task
115
+ def push(task)
116
116
  acts_as_task_queue_tasks << task
117
117
  end
118
118
 
119
119
 
120
120
  # Get the next ready to run task out of the queue. Consider the priority and the dependent tasks, which is defined in the association defined on
121
121
  # top of this model.
122
- def pop args = {}
122
+ def pop(args = {})
123
123
  task = nil
124
124
  log_debug = acts_as_task_queue_config.debug
125
125
 
126
126
  transaction do
127
127
  # Find next pending task, where all dependent tasks are executed
128
128
  all_tasks = acts_as_task_queue_tasks.lock(true).all
129
- i = 0
130
- while task.nil? && i < all_tasks.count do
131
- t = all_tasks[i]
129
+ pos = 0
130
+ while task.nil? && pos < all_tasks.count do
131
+ t = all_tasks[pos]
132
132
  if t.dependent_tasks_executed?
133
133
  task = t if t.state == 'new'
134
134
  else
135
135
  log :msg => "Task #{t.id}: Waiting for dependent tasks #{t.dependent_tasks.map{|dt| dt.id}.join ','}...", :sev => :debug if log_debug
136
136
  end
137
- i += 1
137
+ pos += 1
138
138
  end
139
139
 
140
140
  # Remove task from current queue
@@ -268,7 +268,7 @@ module QueueDispatcher
268
268
 
269
269
 
270
270
  # Execute all tasks in the queue
271
- def run! args = {}
271
+ def run!(args = {})
272
272
  task = nil
273
273
  @logger = args[:logger] || Logger.new("#{File.expand_path(Rails.root)}/log/task_queue.log")
274
274
  finish_state = 'aborted'
@@ -278,7 +278,7 @@ module QueueDispatcher
278
278
  task_queue.update_attribute :state, 'running'
279
279
 
280
280
  # Set logger in engine
281
- @engine.logger = @logger if defined? @engine
281
+ @engine.logger = @logger if defined? @engine && @engine.methods.include?(:logger=)
282
282
  log :msg => "#{name}: Starting TaskQueue #{task_queue.id}...", :print_log => print_log
283
283
 
284
284
  # Init. Pop first task from queue, to show init_queue-state
@@ -311,26 +311,26 @@ module QueueDispatcher
311
311
  # Execute the method defined in task.method
312
312
  if task.target.methods.include?(task.method_name) || task.target.methods.include?(task.method_name.to_sym)
313
313
  if task.dependent_tasks_had_errors
314
- error_msg = "Dependent tasks had errors!"
314
+ error_msg = 'Dependent tasks had errors!'
315
315
  log :msg => error_msg,
316
316
  :sev => :warn,
317
317
  :print_log => print_log
318
- rc_and_msg = QueueDispatcher::RcAndMsg.bad_rc error_msg
318
+ result = QueueDispatcher::RcAndMsg.bad_rc error_msg
319
319
  else
320
320
  target = task.target
321
321
  target.logger = @logger if target.methods.include?(:logger=) || target.methods.include?('logger=')
322
- rc_and_msg = task.execute!
322
+ result = task.execute!
323
323
  end
324
324
  else
325
325
  error_msg = "unknown method '#{task.method_name}' for #{task.target.class.name}!"
326
326
  log :msg => error_msg,
327
327
  :sev => :warn,
328
328
  :print_log => print_log
329
- rc_and_msg = QueueDispatcher::RcAndMsg.bad_rc error_msg
329
+ result = QueueDispatcher::RcAndMsg.bad_rc error_msg
330
330
  end
331
331
 
332
332
  # Change task state according to the return code and remove it from the queue
333
- task.update_state rc_and_msg
333
+ task.update_state result
334
334
  cleanup_locks_after_error_for task
335
335
  task.update_attribute :task_queue_id, nil unless acts_as_task_queue_config.leave_finished_tasks_in_queue
336
336
  log :msg => "#{name}: Task #{task.id} (#{task.target.class.name}.#{task.method_name}) finished with state '#{task.state}'.", :print_log => print_log
@@ -410,7 +410,7 @@ module QueueDispatcher
410
410
  end
411
411
 
412
412
 
413
- def determine_state_of_task_array task_array
413
+ def determine_state_of_task_array(task_array)
414
414
  successful = true
415
415
  new = true
416
416
  pending = false
@@ -444,17 +444,17 @@ module QueueDispatcher
444
444
 
445
445
 
446
446
  # Get Lock
447
- def get_lock_for task
447
+ def get_lock_for(task)
448
448
  end
449
449
 
450
450
 
451
451
  # Release Lock
452
- def release_lock_for task
452
+ def release_lock_for(task)
453
453
  end
454
454
 
455
455
 
456
456
  # Clean up locks after an error occured
457
- def cleanup_locks_after_error_for task
457
+ def cleanup_locks_after_error_for(task)
458
458
  release_lock_for task
459
459
  end
460
460
 
@@ -16,8 +16,8 @@ module QueueDispatcher
16
16
  task_queue = ::TaskQueue.find_or_create_by_name task_queue_name, terminate_immediately: terminate_immediately
17
17
 
18
18
  # Create Task
19
- default_values = {priority: 100}
20
- mandatory_values = {target: @target, method_name: method, args: args, state: 'new', task_queue: task_queue}
19
+ default_values = {priority: 100}
20
+ mandatory_values = {target: @target, method_name: method, args: args, state: 'new', task_queue_id: task_queue.id}
21
21
  ::Task.create default_values.merge(@options).merge(mandatory_values)
22
22
  end
23
23
  end
@@ -1,3 +1,3 @@
1
1
  module QueueDispatcher
2
- VERSION = "1.3.1"
2
+ VERSION = "1.5.1"
3
3
  end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: queue_dispatcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
5
- prerelease:
4
+ version: 1.5.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Philip Kurmann
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-07-23 00:00:00.000000000 Z
11
+ date: 2014-06-30 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: sys-proctable
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: deadlock_retry
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ! '>='
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: spawn
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ! '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ! '>='
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: haml
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ! '>='
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ! '>='
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: will_paginate
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ! '>='
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ! '>='
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: jquery-rails
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ! '>='
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ! '>='
108
95
  - !ruby/object:Gem::Version
@@ -141,6 +128,9 @@ files:
141
128
  - app/views/queue_dispatcher_views/my_events.js.erb
142
129
  - app/views/queue_dispatcher_views/update_events.js.erb
143
130
  - lib/generators/queue_dispatcher/migration/migration_generator.rb
131
+ - lib/generators/queue_dispatcher/migration/templates/add_interrupts_to_tasks_queues.rb
132
+ - lib/generators/queue_dispatcher/migration/templates/add_result_to_tasks.rb
133
+ - lib/generators/queue_dispatcher/migration/templates/change_message_type_for_tasks.rb
144
134
  - lib/generators/queue_dispatcher/migration/templates/task_dependencies.rb
145
135
  - lib/generators/queue_dispatcher/migration/templates/task_queues.rb
146
136
  - lib/generators/queue_dispatcher/migration/templates/tasks.rb
@@ -162,26 +152,25 @@ files:
162
152
  - script/queue_worker_dispatcher
163
153
  homepage: ''
164
154
  licenses: []
155
+ metadata: {}
165
156
  post_install_message:
166
157
  rdoc_options: []
167
158
  require_paths:
168
159
  - lib
169
160
  required_ruby_version: !ruby/object:Gem::Requirement
170
- none: false
171
161
  requirements:
172
162
  - - ! '>='
173
163
  - !ruby/object:Gem::Version
174
164
  version: '0'
175
165
  required_rubygems_version: !ruby/object:Gem::Requirement
176
- none: false
177
166
  requirements:
178
167
  - - ! '>='
179
168
  - !ruby/object:Gem::Version
180
169
  version: '0'
181
170
  requirements: []
182
171
  rubyforge_project:
183
- rubygems_version: 1.8.23
172
+ rubygems_version: 2.0.3
184
173
  signing_key:
185
- specification_version: 3
174
+ specification_version: 4
186
175
  summary: This Gem installs a queue dispatcher for handling asynchronous tasks
187
176
  test_files: []