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