workhorse 0.3.0 → 0.3.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 +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +4 -0
- data/LICENSE +1 -1
- data/README.md +9 -7
- data/VERSION +1 -1
- data/lib/generators/workhorse/templates/create_table_jobs.rb +2 -2
- data/lib/workhorse.rb +5 -2
- data/lib/workhorse/daemon/shell_handler.rb +22 -22
- data/lib/workhorse/poller.rb +7 -2
- data/workhorse.gemspec +4 -4
- metadata +27 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 988bad51b4a7ea3316129ee6119d4a4ad5412cb5
|
4
|
+
data.tar.gz: 188a0a4f98ec7ae2a144de341764547ccec7d76a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f04fd7e1a186d9ffd196a803e2e251c71812e922e4bd1f5b7f8ceb21b2d816c8b031b4c031bde83de5dc210df362d88e2af5593ea94c6f8b9531d42b3e9cd0b
|
7
|
+
data.tar.gz: a1253139820afa9e4035b85c61ed663e8f8caf6eefa3aec2c040ad3e36e5859d195c3bed6133d46c07fb9751af766e78db1252e6f6fb4857095429dfffefc100
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -33,6 +33,8 @@ What it does not do:
|
|
33
33
|
|
34
34
|
### Requirements
|
35
35
|
|
36
|
+
* Ruby `>= 2.0.0`
|
37
|
+
* Rails `>= 3.2`
|
36
38
|
* A database and table handler that properly supports row-level locking (such as
|
37
39
|
MySQL with InnoDB, PostgreSQL, or Oracle).
|
38
40
|
* If you are planning on using the daemons handler:
|
@@ -148,26 +150,26 @@ achieving regular execution:
|
|
148
150
|
|
149
151
|
```ruby
|
150
152
|
#!/usr/bin/env ruby
|
151
|
-
|
153
|
+
|
152
154
|
require './config/environment'
|
153
|
-
|
155
|
+
|
154
156
|
Workhorse::Daemon::ShellHandler.run do
|
155
157
|
worker = Workhorse::Worker.new(pool_size: 5, polling_interval: 10, logger: Rails.logger)
|
156
158
|
scheduler = Rufus::Scheduler.new
|
157
|
-
|
159
|
+
|
158
160
|
worker.start
|
159
|
-
|
161
|
+
|
160
162
|
scheduler.cron '0/10 * * * *' do
|
161
163
|
Workhorse.enqueue Workhorse::Jobs::CleanupSucceededJobs.new
|
162
164
|
end
|
163
|
-
|
165
|
+
|
164
166
|
Signal.trap 'TERM' do
|
165
167
|
scheduler.shutdown
|
166
168
|
Thread.new do
|
167
169
|
worker.shutdown
|
168
170
|
end.join
|
169
171
|
end
|
170
|
-
|
172
|
+
|
171
173
|
scheduler.join
|
172
174
|
worker.wait
|
173
175
|
end
|
@@ -248,4 +250,4 @@ Please consult the [FAQ](FAQ.md).
|
|
248
250
|
|
249
251
|
## Copyright
|
250
252
|
|
251
|
-
Copyright ©
|
253
|
+
Copyright © 2018 Sitrox. See `LICENSE` for further details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.1
|
@@ -1,9 +1,9 @@
|
|
1
|
-
class CreateTableJobs < ActiveRecord::Migration
|
1
|
+
class CreateTableJobs < ActiveRecord::Migration
|
2
2
|
def change
|
3
3
|
create_table :jobs, force: true do |t|
|
4
4
|
t.string :state, null: false, default: 'waiting'
|
5
5
|
t.string :queue, null: true
|
6
|
-
t.
|
6
|
+
t.blob :handler, null: false, limit: 4_294_967_295
|
7
7
|
|
8
8
|
t.string :locked_by
|
9
9
|
t.datetime :locked_at
|
data/lib/workhorse.rb
CHANGED
@@ -5,6 +5,9 @@ require 'active_record'
|
|
5
5
|
require 'workhorse/enqueuer'
|
6
6
|
|
7
7
|
module Workhorse
|
8
|
+
# Check if the available Arel version is greater or equal than 7.0.0
|
9
|
+
AREL_GTE_7 = Gem::Version.new(Arel::VERSION) >= Gem::Version.new('7.0.0')
|
10
|
+
|
8
11
|
extend Workhorse::Enqueuer
|
9
12
|
|
10
13
|
@set_up = false
|
@@ -16,12 +19,12 @@ module Workhorse
|
|
16
19
|
|| fail('No performer is associated with the current thread. This method must always be called inside of a job.')
|
17
20
|
end
|
18
21
|
|
19
|
-
|
22
|
+
mattr_accessor :tx_callback
|
20
23
|
self.tx_callback = proc do |&block|
|
21
24
|
ActiveRecord::Base.transaction(&block)
|
22
25
|
end
|
23
26
|
|
24
|
-
|
27
|
+
mattr_accessor :perform_jobs_in_tx
|
25
28
|
self.perform_jobs_in_tx = true
|
26
29
|
|
27
30
|
def self.setup
|
@@ -41,36 +41,36 @@ module Workhorse
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def self.usage
|
44
|
-
warn
|
45
|
-
|
44
|
+
warn <<USAGE
|
45
|
+
Usage: #{$PROGRAM_NAME} start|stop|status|watch|restart|usage
|
46
46
|
|
47
|
-
|
47
|
+
Options:
|
48
48
|
|
49
|
-
|
50
|
-
|
49
|
+
start
|
50
|
+
Start the daemon
|
51
51
|
|
52
|
-
|
53
|
-
|
52
|
+
stop
|
53
|
+
Stop the daemon
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
status
|
56
|
+
Query the status of the daemon. Exit with status 1 if any worker is
|
57
|
+
not running.
|
58
58
|
|
59
|
-
|
60
|
-
|
61
|
-
|
59
|
+
watch
|
60
|
+
Checks the status (running or stopped) and whether it is as
|
61
|
+
expected. Starts the daemon if it is expected to run but is not.
|
62
62
|
|
63
|
-
|
64
|
-
|
63
|
+
restart
|
64
|
+
Shortcut for consecutive 'stop' and 'start'.
|
65
65
|
|
66
|
-
|
67
|
-
|
66
|
+
usage
|
67
|
+
Show this message
|
68
68
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
69
|
+
Exit status:
|
70
|
+
0 if OK,
|
71
|
+
1 if at least one worker has an unexpected status,
|
72
|
+
99 on all other errors.
|
73
|
+
USAGE
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
data/lib/workhorse/poller.rb
CHANGED
@@ -122,7 +122,11 @@ module Workhorse
|
|
122
122
|
union_query_sql += ') subselect'
|
123
123
|
|
124
124
|
# Create a new SelectManager to work with, using the UNION as data source
|
125
|
-
|
125
|
+
if AREL_GTE_7
|
126
|
+
select = Arel::SelectManager.new(Arel.sql(union_query_sql))
|
127
|
+
else
|
128
|
+
select = Arel::SelectManager.new(ActiveRecord::Base, Arel.sql(union_query_sql))
|
129
|
+
end
|
126
130
|
select = order(select.project(Arel.star))
|
127
131
|
|
128
132
|
# Limit number of records
|
@@ -186,7 +190,8 @@ module Workhorse
|
|
186
190
|
# Restrict queues that are currently in progress
|
187
191
|
bad_queries_select = table.project(table[:queue])
|
188
192
|
.where(table[:state].in(%i[locked running]))
|
189
|
-
|
193
|
+
# .distinct is not chainable in older Arel versions
|
194
|
+
bad_queries_select.distinct
|
190
195
|
select = select.where(table[:queue].not_in(bad_queries_select))
|
191
196
|
|
192
197
|
# Restrict queues to valid ones as indicated by the options given to the
|
data/workhorse.gemspec
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: workhorse 0.3.
|
2
|
+
# stub: workhorse 0.3.1 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "workhorse".freeze
|
6
|
-
s.version = "0.3.
|
6
|
+
s.version = "0.3.1"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib".freeze]
|
10
10
|
s.authors = ["Sitrox".freeze]
|
11
|
-
s.date = "
|
11
|
+
s.date = "2018-02-22"
|
12
12
|
s.files = [".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, ".travis.yml".freeze, "CHANGELOG.md".freeze, "FAQ.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/rubocop".freeze, "lib/generators/workhorse/install_generator.rb".freeze, "lib/generators/workhorse/templates/bin/workhorse.rb".freeze, "lib/generators/workhorse/templates/config/initializers/workhorse.rb".freeze, "lib/generators/workhorse/templates/create_table_jobs.rb".freeze, "lib/workhorse.rb".freeze, "lib/workhorse/daemon.rb".freeze, "lib/workhorse/daemon/shell_handler.rb".freeze, "lib/workhorse/db_job.rb".freeze, "lib/workhorse/enqueuer.rb".freeze, "lib/workhorse/jobs/cleanup_succeeded_jobs.rb".freeze, "lib/workhorse/jobs/run_rails_op.rb".freeze, "lib/workhorse/performer.rb".freeze, "lib/workhorse/poller.rb".freeze, "lib/workhorse/pool.rb".freeze, "lib/workhorse/worker.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze, "workhorse.gemspec".freeze]
|
13
|
-
s.rubygems_version = "2.
|
13
|
+
s.rubygems_version = "2.6.6".freeze
|
14
14
|
s.summary = "Multi-threaded job backend with database queuing for ruby.".freeze
|
15
15
|
s.test_files = ["test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze]
|
16
16
|
|
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: workhorse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sitrox
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
@@ -56,98 +56,98 @@ dependencies:
|
|
56
56
|
name: minitest
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: mysql2
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: 0.3.13
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.3.13
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: benchmark-ips
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - '>='
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - '>='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: activesupport
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - '>='
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: activerecord
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - '>='
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - '>='
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: schemacop
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- -
|
129
|
+
- - ~>
|
130
130
|
- !ruby/object:Gem::Version
|
131
131
|
version: '2.0'
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- -
|
136
|
+
- - ~>
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '2.0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: concurrent-ruby
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
|
-
- -
|
143
|
+
- - '>='
|
144
144
|
- !ruby/object:Gem::Version
|
145
145
|
version: '0'
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
|
-
- -
|
150
|
+
- - '>='
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
description:
|
@@ -156,10 +156,10 @@ executables: []
|
|
156
156
|
extensions: []
|
157
157
|
extra_rdoc_files: []
|
158
158
|
files:
|
159
|
-
-
|
160
|
-
-
|
161
|
-
-
|
162
|
-
-
|
159
|
+
- .gitignore
|
160
|
+
- .releaser_config
|
161
|
+
- .rubocop.yml
|
162
|
+
- .travis.yml
|
163
163
|
- CHANGELOG.md
|
164
164
|
- FAQ.md
|
165
165
|
- Gemfile
|
@@ -202,17 +202,17 @@ require_paths:
|
|
202
202
|
- lib
|
203
203
|
required_ruby_version: !ruby/object:Gem::Requirement
|
204
204
|
requirements:
|
205
|
-
- -
|
205
|
+
- - '>='
|
206
206
|
- !ruby/object:Gem::Version
|
207
207
|
version: '0'
|
208
208
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
209
209
|
requirements:
|
210
|
-
- -
|
210
|
+
- - '>='
|
211
211
|
- !ruby/object:Gem::Version
|
212
212
|
version: '0'
|
213
213
|
requirements: []
|
214
214
|
rubyforge_project:
|
215
|
-
rubygems_version: 2.
|
215
|
+
rubygems_version: 2.0.14
|
216
216
|
signing_key:
|
217
217
|
specification_version: 4
|
218
218
|
summary: Multi-threaded job backend with database queuing for ruby.
|