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 +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: []
|