queue_dispatcher 1.3.1 → 1.5.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.
- checksums.yaml +15 -0
- data/.gitignore +1 -0
- data/README.rdoc +2 -0
- data/lib/generators/queue_dispatcher/migration/migration_generator.rb +3 -1
- data/lib/generators/queue_dispatcher/migration/templates/add_interrupts_to_tasks_queues.rb +9 -0
- data/lib/generators/queue_dispatcher/migration/templates/add_result_to_tasks.rb +9 -0
- data/lib/generators/queue_dispatcher/migration/templates/change_message_type_for_tasks.rb +9 -0
- data/lib/queue_dispatcher/acts_as_task.rb +22 -17
- data/lib/queue_dispatcher/acts_as_task_queue.rb +19 -19
- data/lib/queue_dispatcher/message_sending.rb +2 -2
- data/lib/queue_dispatcher/version.rb +1 -1
- metadata +8 -19
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
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
|
@@ -15,7 +15,7 @@ module QueueDispatcher
|
|
15
15
|
|
16
16
|
|
17
17
|
module ClassMethods
|
18
|
-
def acts_as_task
|
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(
|
68
|
+
def update_state(result, remove_from_queue = false)
|
68
69
|
rc = output = error_msg = nil
|
69
70
|
|
70
|
-
if
|
71
|
-
rc
|
72
|
-
output
|
73
|
-
error_msg =
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
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
|
86
|
+
self.update_attributes :state => 'successful',
|
84
87
|
:perc_finished => 100,
|
85
|
-
:message
|
88
|
+
:message => output.truncate(10256),
|
89
|
+
:result => result
|
86
90
|
else
|
87
|
-
self.update_attributes :state
|
91
|
+
self.update_attributes :state => 'error',
|
88
92
|
:error_msg => error_msg,
|
89
|
-
:message
|
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
|
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
|
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
|
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
|
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
|
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
|
-
|
130
|
-
while task.nil? &&
|
131
|
-
t = all_tasks[
|
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
|
-
|
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!
|
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 =
|
314
|
+
error_msg = 'Dependent tasks had errors!'
|
315
315
|
log :msg => error_msg,
|
316
316
|
:sev => :warn,
|
317
317
|
:print_log => print_log
|
318
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
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
|
447
|
+
def get_lock_for(task)
|
448
448
|
end
|
449
449
|
|
450
450
|
|
451
451
|
# Release Lock
|
452
|
-
def release_lock_for
|
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
|
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
|
20
|
-
mandatory_values = {target: @target, method_name: method, args: args, state: 'new',
|
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
|
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.
|
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:
|
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:
|
172
|
+
rubygems_version: 2.0.3
|
184
173
|
signing_key:
|
185
|
-
specification_version:
|
174
|
+
specification_version: 4
|
186
175
|
summary: This Gem installs a queue dispatcher for handling asynchronous tasks
|
187
176
|
test_files: []
|