workhorse 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/FAQ.md +0 -4
- data/README.md +13 -4
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/lib/active_job/queue_adapters/workhorse_adapter.rb +22 -0
- data/lib/workhorse.rb +5 -0
- data/lib/workhorse/enqueuer.rb +6 -2
- data/lib/workhorse/jobs/run_active_job.rb +11 -0
- data/test/active_job/queue_adapters/workhorse_adapter_test.rb +93 -0
- data/test/lib/test_helper.rb +1 -0
- data/test/workhorse/performer_test.rb +1 -1
- data/workhorse.gemspec +8 -5
- metadata +20 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d44a186907b790e7c3841ebfa08c4d6adf15906276c85c562e18b77927198c4c
|
4
|
+
data.tar.gz: e9d2e237c2980ce22783cbf9f5352824dffe2fc2ac055499e9578c30a0b237f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88f2d387aeedf2c8128bc0d733d764eb5094be3c458c1ee954578647203b7cbd4907ec0159e81e05a7426674776ee0a53b2b7355523ee67be1ac1dc42d331243
|
7
|
+
data.tar.gz: 5630d627210c264dd14c9b29a233631a99dfbd1fe1e49e64ffa2cfd2f0e1d71f63869153e175a437c0b07152278ed687a713f8d58e7450b6242fb4ed32a1ca17
|
data/CHANGELOG.md
CHANGED
data/FAQ.md
CHANGED
@@ -75,7 +75,3 @@ production mode.
|
|
75
75
|
## Why does workhorse not support timeouts?
|
76
76
|
|
77
77
|
Generic timeout implementations are [a dangerous thing](http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/) in Ruby. This is why we decided against providing this feature in Workhorse and recommend to implement the timeouts inside of your jobs - i.e. via network timeouts.
|
78
|
-
|
79
|
-
## Why is workhorse not integrated into Rails per default?
|
80
|
-
|
81
|
-
We have submitted [a pull request](https://github.com/rails/rails/pull/31504) to Rails, but they stated that they won't add any new adapters to Rails. There are plans to integrate this on the Gem side only - stay tuned.
|
data/README.md
CHANGED
@@ -345,13 +345,22 @@ Performing a reset will reset the job state to `waiting` and it will be
|
|
345
345
|
processed again. All meta fields will be reset as well. See inline documentation
|
346
346
|
of `Workhorse::DbJob#reset!` for more details.
|
347
347
|
|
348
|
-
## Frequently asked questions
|
349
348
|
|
350
|
-
|
349
|
+
## Using workhorse with Rails / ActiveJob
|
350
|
+
|
351
|
+
While workhorse can be used though its custom interface as documented above, it
|
352
|
+
is also fully integrated into Rails using `ActiveJob`. See [documentation of
|
353
|
+
ActiveJob](https://edgeguides.rubyonrails.org/active_job_basics.html) for more
|
354
|
+
information on how to use it.
|
351
355
|
|
352
|
-
|
356
|
+
To use workhorse as your ActiveJob backend, set the `queue_adapter` to
|
357
|
+
`workhorse`, either using `config.active_job.queue_adapter` in your application
|
358
|
+
configuration or else using `self.queue_adapter` in a job class inheriting from
|
359
|
+
`ActiveJob`. See ActiveJob documentation for more details.
|
353
360
|
|
354
|
-
|
361
|
+
## Frequently asked questions
|
362
|
+
|
363
|
+
Please consult the [FAQ](FAQ.md).
|
355
364
|
|
356
365
|
## Copyright
|
357
366
|
|
data/Rakefile
CHANGED
@@ -18,6 +18,7 @@ task :gemspec do
|
|
18
18
|
spec.add_development_dependency 'mysql2'
|
19
19
|
spec.add_development_dependency 'colorize'
|
20
20
|
spec.add_development_dependency 'benchmark-ips'
|
21
|
+
spec.add_development_dependency 'activejob'
|
21
22
|
spec.add_dependency 'activesupport'
|
22
23
|
spec.add_dependency 'activerecord'
|
23
24
|
spec.add_dependency 'schemacop', '~> 2.0'
|
@@ -30,7 +31,7 @@ end
|
|
30
31
|
require 'rake/testtask'
|
31
32
|
|
32
33
|
Rake::TestTask.new do |t|
|
33
|
-
t.pattern = 'test
|
34
|
+
t.pattern = 'test/**/*_test.rb'
|
34
35
|
t.verbose = false
|
35
36
|
t.libs << 'test/lib'
|
36
37
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ActiveJob
|
2
|
+
module QueueAdapters
|
3
|
+
# == Workhorse adapter for Active Job
|
4
|
+
#
|
5
|
+
# Workhorse is a multi-threaded job backend with database queuing for ruby.
|
6
|
+
# Jobs are persisted in the database using ActiveRecird.
|
7
|
+
# Read more about Workhorse {here}[https://github.com/sitrox/activejob].
|
8
|
+
#
|
9
|
+
# To use Workhorse, set the queue_adapter config to +:workhorse+.
|
10
|
+
#
|
11
|
+
# Rails.application.config.active_job.queue_adapter = :workhorse
|
12
|
+
class WorkhorseAdapter
|
13
|
+
def enqueue(job) #:nodoc:
|
14
|
+
Workhorse.enqueue_active_job(job)
|
15
|
+
end
|
16
|
+
|
17
|
+
def enqueue_at(job, timestamp) #:nodoc:
|
18
|
+
Workhorse.enqueue_active_job(job, timestamp)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/workhorse.rb
CHANGED
@@ -47,6 +47,7 @@ require 'workhorse/poller'
|
|
47
47
|
require 'workhorse/pool'
|
48
48
|
require 'workhorse/worker'
|
49
49
|
require 'workhorse/jobs/run_rails_op'
|
50
|
+
require 'workhorse/jobs/run_active_job'
|
50
51
|
require 'workhorse/jobs/cleanup_succeeded_jobs'
|
51
52
|
|
52
53
|
# Daemon functionality is not available on java platforms
|
@@ -54,3 +55,7 @@ if RUBY_PLATFORM != 'java'
|
|
54
55
|
require 'workhorse/daemon'
|
55
56
|
require 'workhorse/daemon/shell_handler'
|
56
57
|
end
|
58
|
+
|
59
|
+
if defined?(ActiveJob)
|
60
|
+
require 'active_job/queue_adapters/workhorse_adapter.rb'
|
61
|
+
end
|
data/lib/workhorse/enqueuer.rb
CHANGED
@@ -11,8 +11,12 @@ module Workhorse
|
|
11
11
|
end
|
12
12
|
|
13
13
|
# Enqueue an ActiveJob job
|
14
|
-
def enqueue_active_job(job)
|
15
|
-
|
14
|
+
def enqueue_active_job(job, perform_at = Time.now)
|
15
|
+
wrapper_job = Jobs::RunActiveJob.new(job.serialize)
|
16
|
+
queue = job.queue_name.blank? ? nil : job.queue_name
|
17
|
+
db_job = enqueue(wrapper_job, queue: queue, priority: job.priority || 0, perform_at: Time.at(perform_at))
|
18
|
+
job.provider_job_id = db_job.id
|
19
|
+
return db_job
|
16
20
|
end
|
17
21
|
|
18
22
|
# Enqueue the execution of an operation by its class and params
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ActiveJob::QueueAdapters::WorkhorseAdapterTest < WorkhorseTest
|
4
|
+
class ApplicationJob < ActiveJob::Base; end
|
5
|
+
class CustomException < StandardError; end
|
6
|
+
|
7
|
+
class Job1 < ApplicationJob
|
8
|
+
attr_reader :result
|
9
|
+
|
10
|
+
class_attribute :results
|
11
|
+
|
12
|
+
queue_as ''
|
13
|
+
|
14
|
+
def perform(param)
|
15
|
+
results << param
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Job2 < Job1
|
20
|
+
queue_as :queue1
|
21
|
+
end
|
22
|
+
|
23
|
+
class Job3 < Job1
|
24
|
+
rescue_from CustomException do |e|
|
25
|
+
results << e
|
26
|
+
end
|
27
|
+
|
28
|
+
def perform
|
29
|
+
fail CustomException
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Job4 < Job1
|
34
|
+
after_enqueue do |job|
|
35
|
+
results << job.provider_job_id
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def setup
|
40
|
+
ActiveJob::Base.queue_adapter = :workhorse
|
41
|
+
ActiveJob::Base.logger = nil
|
42
|
+
Workhorse::DbJob.delete_all
|
43
|
+
Job1.results = Concurrent::Array.new
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_basic
|
47
|
+
Job1.perform_later 'foo'
|
48
|
+
work 0.5
|
49
|
+
assert_equal ['foo'], Job1.results
|
50
|
+
assert_nil Workhorse::DbJob.first.queue
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_queue
|
54
|
+
Job2.perform_later 'foo'
|
55
|
+
work 0.5
|
56
|
+
assert_equal ['foo'], Job2.results
|
57
|
+
assert_equal 'queue1', Workhorse::DbJob.first.queue
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_wait
|
61
|
+
Job2.set(wait: 2.seconds).perform_later 'foo'
|
62
|
+
|
63
|
+
work 1, polling_interval: 0.1
|
64
|
+
assert_equal 'waiting', Workhorse::DbJob.first.state
|
65
|
+
|
66
|
+
work 2.5, polling_interval: 0.1
|
67
|
+
assert_equal 'succeeded', Workhorse::DbJob.first.reload.state
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_wait_until
|
71
|
+
Job2.set(wait_until: (Time.now + 2.seconds)).perform_later 'foo'
|
72
|
+
|
73
|
+
work 0.5, polling_interval: 0.1
|
74
|
+
assert_equal 'waiting', Workhorse::DbJob.first.state
|
75
|
+
|
76
|
+
work 1.5, polling_interval: 0.1
|
77
|
+
assert_equal 'succeeded', Workhorse::DbJob.first.reload.state
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_rescue_from
|
81
|
+
Job3.perform_later
|
82
|
+
work 0.5
|
83
|
+
assert_equal 'succeeded', Workhorse::DbJob.first.state
|
84
|
+
assert Job3.results.first.is_a?(CustomException)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_provider_job_id
|
88
|
+
job = Job4.perform_later
|
89
|
+
db_job = Workhorse::DbJob.first
|
90
|
+
assert_equal db_job.id, job.provider_job_id
|
91
|
+
assert_equal [db_job.id], Job1.results
|
92
|
+
end
|
93
|
+
end
|
data/test/lib/test_helper.rb
CHANGED
data/workhorse.gemspec
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: workhorse 0.
|
2
|
+
# stub: workhorse 0.5.0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "workhorse".freeze
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.5.0"
|
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 = "2019-05-
|
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/db_job_test.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]
|
11
|
+
s.date = "2019-05-22"
|
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/active_job/queue_adapters/workhorse_adapter.rb".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_active_job.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/active_job/queue_adapters/workhorse_adapter_test.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/db_job_test.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
13
|
s.rubygems_version = "3.0.3".freeze
|
14
14
|
s.summary = "Multi-threaded job backend with database queuing for ruby.".freeze
|
15
|
-
s.test_files = ["test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/db_job_test.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]
|
15
|
+
s.test_files = ["test/active_job/queue_adapters/workhorse_adapter_test.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/db_job_test.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
|
|
17
17
|
if s.respond_to? :specification_version then
|
18
18
|
s.specification_version = 4
|
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_development_dependency(%q<mysql2>.freeze, [">= 0"])
|
26
26
|
s.add_development_dependency(%q<colorize>.freeze, [">= 0"])
|
27
27
|
s.add_development_dependency(%q<benchmark-ips>.freeze, [">= 0"])
|
28
|
+
s.add_development_dependency(%q<activejob>.freeze, [">= 0"])
|
28
29
|
s.add_runtime_dependency(%q<activesupport>.freeze, [">= 0"])
|
29
30
|
s.add_runtime_dependency(%q<activerecord>.freeze, [">= 0"])
|
30
31
|
s.add_runtime_dependency(%q<schemacop>.freeze, ["~> 2.0"])
|
@@ -37,6 +38,7 @@ Gem::Specification.new do |s|
|
|
37
38
|
s.add_dependency(%q<mysql2>.freeze, [">= 0"])
|
38
39
|
s.add_dependency(%q<colorize>.freeze, [">= 0"])
|
39
40
|
s.add_dependency(%q<benchmark-ips>.freeze, [">= 0"])
|
41
|
+
s.add_dependency(%q<activejob>.freeze, [">= 0"])
|
40
42
|
s.add_dependency(%q<activesupport>.freeze, [">= 0"])
|
41
43
|
s.add_dependency(%q<activerecord>.freeze, [">= 0"])
|
42
44
|
s.add_dependency(%q<schemacop>.freeze, ["~> 2.0"])
|
@@ -50,6 +52,7 @@ Gem::Specification.new do |s|
|
|
50
52
|
s.add_dependency(%q<mysql2>.freeze, [">= 0"])
|
51
53
|
s.add_dependency(%q<colorize>.freeze, [">= 0"])
|
52
54
|
s.add_dependency(%q<benchmark-ips>.freeze, [">= 0"])
|
55
|
+
s.add_dependency(%q<activejob>.freeze, [">= 0"])
|
53
56
|
s.add_dependency(%q<activesupport>.freeze, [">= 0"])
|
54
57
|
s.add_dependency(%q<activerecord>.freeze, [">= 0"])
|
55
58
|
s.add_dependency(%q<schemacop>.freeze, ["~> 2.0"])
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: workhorse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sitrox
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: activejob
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: activesupport
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -183,6 +197,7 @@ files:
|
|
183
197
|
- Rakefile
|
184
198
|
- VERSION
|
185
199
|
- bin/rubocop
|
200
|
+
- lib/active_job/queue_adapters/workhorse_adapter.rb
|
186
201
|
- lib/generators/workhorse/install_generator.rb
|
187
202
|
- lib/generators/workhorse/templates/bin/workhorse.rb
|
188
203
|
- lib/generators/workhorse/templates/config/initializers/workhorse.rb
|
@@ -193,11 +208,13 @@ files:
|
|
193
208
|
- lib/workhorse/db_job.rb
|
194
209
|
- lib/workhorse/enqueuer.rb
|
195
210
|
- lib/workhorse/jobs/cleanup_succeeded_jobs.rb
|
211
|
+
- lib/workhorse/jobs/run_active_job.rb
|
196
212
|
- lib/workhorse/jobs/run_rails_op.rb
|
197
213
|
- lib/workhorse/performer.rb
|
198
214
|
- lib/workhorse/poller.rb
|
199
215
|
- lib/workhorse/pool.rb
|
200
216
|
- lib/workhorse/worker.rb
|
217
|
+
- test/active_job/queue_adapters/workhorse_adapter_test.rb
|
201
218
|
- test/lib/db_schema.rb
|
202
219
|
- test/lib/jobs.rb
|
203
220
|
- test/lib/test_helper.rb
|
@@ -231,6 +248,7 @@ signing_key:
|
|
231
248
|
specification_version: 4
|
232
249
|
summary: Multi-threaded job backend with database queuing for ruby.
|
233
250
|
test_files:
|
251
|
+
- test/active_job/queue_adapters/workhorse_adapter_test.rb
|
234
252
|
- test/lib/db_schema.rb
|
235
253
|
- test/lib/jobs.rb
|
236
254
|
- test/lib/test_helper.rb
|