workhorse 1.2.1 → 1.2.5
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/.github/workflows/ruby.yml +36 -0
- data/CHANGELOG.md +19 -0
- data/LICENSE +1 -1
- data/README.md +24 -4
- data/Rakefile +0 -1
- data/VERSION +1 -1
- data/lib/workhorse/db_job.rb +2 -0
- data/lib/workhorse/enqueuer.rb +1 -1
- data/lib/workhorse/jobs/detect_stale_jobs_job.rb +15 -11
- data/lib/workhorse.rb +12 -0
- data/test/lib/test_helper.rb +1 -1
- data/workhorse.gemspec +4 -7
- metadata +4 -18
- data/.travis.yml +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8b46dee93b4c068a0448cede864128197aea8393c592527402bd42a2d7d5412
|
4
|
+
data.tar.gz: e808736be9666ff28aa8e16db00894a2668d23fec91b29aa6a4af6d5aaf45cdf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b80105eae609607dc11fc044d62e764222c110e735600ae1eae432ff36916e7a554c63b964d95a08d6730f4c78ba0b509aab37ae6860b76f60250adda6c495d
|
7
|
+
data.tar.gz: 957e7f435fb08673307907689fcd0d0c46ab434362ec629a6f5ff7ba5cf50dd138f6042530ce44f289ee900fa5359b787884f5405a935a312e6da38155d7fd24
|
@@ -0,0 +1,36 @@
|
|
1
|
+
name: Build
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
strategy:
|
13
|
+
fail-fast: false
|
14
|
+
matrix:
|
15
|
+
ruby-version: ['2.5.1', '2.6.2', '2.7.1', '3.0.1']
|
16
|
+
env:
|
17
|
+
DB_DATABASE: workhorse
|
18
|
+
DB_USER: root
|
19
|
+
DB_PASSWORD: 'root'
|
20
|
+
DB_HOST: localhost
|
21
|
+
|
22
|
+
steps:
|
23
|
+
- uses: actions/checkout@v2
|
24
|
+
- name: Set up Ruby
|
25
|
+
uses: ruby/setup-ruby@v1
|
26
|
+
with:
|
27
|
+
ruby-version: ${{ matrix.ruby-version }}
|
28
|
+
bundler-cache: true
|
29
|
+
- name: Startup database
|
30
|
+
run: |
|
31
|
+
sudo /etc/init.d/mysql start
|
32
|
+
mysql -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }} -e 'CREATE DATABASE ${{ env.DB_DATABASE }};'
|
33
|
+
- name: Run rake tests
|
34
|
+
run: bundle exec rake test TESTOPTS='--verbose'
|
35
|
+
- name: Run rubocop
|
36
|
+
run: bundle exec rubocop
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,24 @@
|
|
1
1
|
# Workhorse Changelog
|
2
2
|
|
3
|
+
## 1.2.5 - 2021-11-01
|
4
|
+
|
5
|
+
* Add config settings for configuring {Workhorse::Jobs::DetectStaleJobsJob}:
|
6
|
+
|
7
|
+
* `config.stale_detection_locked_to_started_threshold`
|
8
|
+
* `config.stale_detection_run_time_threshold`
|
9
|
+
|
10
|
+
## 1.2.4 - 2021-06-08
|
11
|
+
|
12
|
+
* Add `workhorse_db_job` load hook
|
13
|
+
|
14
|
+
## 1.2.3 - 2021-02-09
|
15
|
+
|
16
|
+
* Fix warning with ruby 2.7
|
17
|
+
|
18
|
+
## 1.2.2 - 2021-01-27
|
19
|
+
|
20
|
+
* Remove unused gem dependency to `schemacop`
|
21
|
+
|
3
22
|
## 1.2.1 - 2021-01-27
|
4
23
|
|
5
24
|
* Log job description (if given) when performing job
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
[](https://github.com/sitrox/workhorse/actions/workflows/ruby.yml)
|
2
2
|
[](https://badge.fury.io/rb/workhorse)
|
3
3
|
|
4
4
|
# Workhorse
|
@@ -107,10 +107,15 @@ method `Workhorse.enqueue_op`:
|
|
107
107
|
Workhorse.enqueue_op Operations::Jobs::CleanUpDatabase, { queue: :maintenance, priority: 2 }, quiet: true
|
108
108
|
```
|
109
109
|
|
110
|
-
|
111
|
-
|
110
|
+
The first argument of the method is the Operation you want to run. Params passed in
|
111
|
+
using the second argument will be used by Workhorse and params passed using the
|
112
|
+
third argument will be used for operation instantiation at job execution, i.e.:
|
112
113
|
|
113
|
-
|
114
|
+
```ruby
|
115
|
+
Workhorse.enqueue_op <Operation Class Name>, { <Workhorse Options> }, { <RailsOps Options> }
|
116
|
+
```
|
117
|
+
|
118
|
+
If you do not want to pass any params to the operation, just omit the third hash:
|
114
119
|
|
115
120
|
```ruby
|
116
121
|
Workhorse.enqueue_op Operations::Jobs::CleanUpDatabase, queue: :maintenance, priority: 2
|
@@ -384,6 +389,21 @@ jobs database on a regular interval. Workhorse provides the job
|
|
384
389
|
`Workhorse::Jobs::CleanupSucceededJobs` for this purpose that cleans up all
|
385
390
|
succeeded jobs. You can run this using your scheduler in a specific interval.
|
386
391
|
|
392
|
+
## Load hooks
|
393
|
+
|
394
|
+
Using the load hook `:workhorse_db_job`, you can inject custom code into the
|
395
|
+
Gem-internal model class `Workhorse::DbJob`, for example:
|
396
|
+
|
397
|
+
```ruby
|
398
|
+
# config/initializers/workhorse.rb
|
399
|
+
|
400
|
+
ActiveSupport.on_load :workhorse_db_job do
|
401
|
+
# Code within this block will be run inside of the model class
|
402
|
+
# Workhorse::DbJob.
|
403
|
+
belongs_to :user
|
404
|
+
end
|
405
|
+
```
|
406
|
+
|
387
407
|
## Caveats
|
388
408
|
|
389
409
|
### Errors during polling / crashed workers
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.2.
|
1
|
+
1.2.5
|
data/lib/workhorse/db_job.rb
CHANGED
data/lib/workhorse/enqueuer.rb
CHANGED
@@ -1,18 +1,22 @@
|
|
1
1
|
module Workhorse::Jobs
|
2
|
+
# This job picks up jobs that remained `locked` or `started` (running) for
|
3
|
+
# more than a certain amount of time. If any of these jobs are found, an
|
4
|
+
# exception is thrown (which may cause a notification if you configured
|
5
|
+
# `on_exception` accordingly).
|
6
|
+
#
|
7
|
+
# The thresholds are obtained from the configuration options
|
8
|
+
# {Workhorse.stale_detection_locked_to_started_threshold
|
9
|
+
# config.stale_detection_locked_to_started_threshold} and
|
10
|
+
# {Workhorse.stale_detection_run_time_threshold
|
11
|
+
# config.stale_detection_run_time_threshold}.
|
2
12
|
class DetectStaleJobsJob
|
3
|
-
#
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
# Set this to 0 to skip this check.
|
8
|
-
# @param run_time_threshold [Integer] The maximum number of seconds
|
9
|
-
# a job is allowed to run before this job throws an exception. Set this to
|
10
|
-
# 0 to skip this check.
|
11
|
-
def initialize(locked_to_started_threshold: 3 * 60, run_time_threshold: 12 * 60)
|
12
|
-
@locked_to_started_threshold = locked_to_started_threshold
|
13
|
-
@run_time_threshold = run_time_threshold
|
13
|
+
# @private
|
14
|
+
def initialize
|
15
|
+
@locked_to_started_threshold = Workhorse.stale_detection_locked_to_started_threshold
|
16
|
+
@run_time_threshold = Workhorse.stale_detection_run_time_threshold
|
14
17
|
end
|
15
18
|
|
19
|
+
# @private
|
16
20
|
def perform
|
17
21
|
messages = []
|
18
22
|
|
data/lib/workhorse.rb
CHANGED
@@ -45,6 +45,18 @@ module Workhorse
|
|
45
45
|
mattr_accessor :perform_jobs_in_tx
|
46
46
|
self.perform_jobs_in_tx = true
|
47
47
|
|
48
|
+
# This setting is for {Workhorse::Jobs::DetectStaleJobsJob} and specifies the
|
49
|
+
# maximum number of seconds a job is allowed to stay 'locked' before this job
|
50
|
+
# throws an exception. Set this to 0 to skip this check.
|
51
|
+
mattr_accessor :stale_detection_locked_to_started_threshold
|
52
|
+
self.stale_detection_locked_to_started_threshold = 3 * 60
|
53
|
+
|
54
|
+
# This setting is for {Workhorse::Jobs::DetectStaleJobsJob} and specifies the
|
55
|
+
# maximum number of seconds a job is allowed to run before this job throws an
|
56
|
+
# exception. Set this to 0 to skip this check.
|
57
|
+
mattr_accessor :stale_detection_run_time_threshold
|
58
|
+
self.stale_detection_run_time_threshold = 12 * 60
|
59
|
+
|
48
60
|
def self.setup
|
49
61
|
yield self
|
50
62
|
end
|
data/test/lib/test_helper.rb
CHANGED
data/workhorse.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: workhorse 1.2.
|
2
|
+
# stub: workhorse 1.2.5 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "workhorse".freeze
|
6
|
-
s.version = "1.2.
|
6
|
+
s.version = "1.2.5"
|
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 = "2021-01
|
12
|
-
s.files = [".
|
11
|
+
s.date = "2021-11-01"
|
12
|
+
s.files = [".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.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/detect_stale_jobs_job.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/scoped_env.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
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]
|
@@ -29,7 +29,6 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.add_development_dependency(%q<pry>.freeze, [">= 0"])
|
30
30
|
s.add_runtime_dependency(%q<activesupport>.freeze, [">= 0"])
|
31
31
|
s.add_runtime_dependency(%q<activerecord>.freeze, [">= 0"])
|
32
|
-
s.add_runtime_dependency(%q<schemacop>.freeze, ["~> 2.0"])
|
33
32
|
s.add_runtime_dependency(%q<concurrent-ruby>.freeze, [">= 0"])
|
34
33
|
else
|
35
34
|
s.add_dependency(%q<bundler>.freeze, [">= 0"])
|
@@ -43,7 +42,6 @@ Gem::Specification.new do |s|
|
|
43
42
|
s.add_dependency(%q<pry>.freeze, [">= 0"])
|
44
43
|
s.add_dependency(%q<activesupport>.freeze, [">= 0"])
|
45
44
|
s.add_dependency(%q<activerecord>.freeze, [">= 0"])
|
46
|
-
s.add_dependency(%q<schemacop>.freeze, ["~> 2.0"])
|
47
45
|
s.add_dependency(%q<concurrent-ruby>.freeze, [">= 0"])
|
48
46
|
end
|
49
47
|
else
|
@@ -58,7 +56,6 @@ Gem::Specification.new do |s|
|
|
58
56
|
s.add_dependency(%q<pry>.freeze, [">= 0"])
|
59
57
|
s.add_dependency(%q<activesupport>.freeze, [">= 0"])
|
60
58
|
s.add_dependency(%q<activerecord>.freeze, [">= 0"])
|
61
|
-
s.add_dependency(%q<schemacop>.freeze, ["~> 2.0"])
|
62
59
|
s.add_dependency(%q<concurrent-ruby>.freeze, [">= 0"])
|
63
60
|
end
|
64
61
|
end
|
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: 1.2.
|
4
|
+
version: 1.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sitrox
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01
|
11
|
+
date: 2021-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -164,20 +164,6 @@ dependencies:
|
|
164
164
|
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: schemacop
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - "~>"
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: '2.0'
|
174
|
-
type: :runtime
|
175
|
-
prerelease: false
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - "~>"
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: '2.0'
|
181
167
|
- !ruby/object:Gem::Dependency
|
182
168
|
name: concurrent-ruby
|
183
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,10 +184,10 @@ executables: []
|
|
198
184
|
extensions: []
|
199
185
|
extra_rdoc_files: []
|
200
186
|
files:
|
187
|
+
- ".github/workflows/ruby.yml"
|
201
188
|
- ".gitignore"
|
202
189
|
- ".releaser_config"
|
203
190
|
- ".rubocop.yml"
|
204
|
-
- ".travis.yml"
|
205
191
|
- CHANGELOG.md
|
206
192
|
- FAQ.md
|
207
193
|
- Gemfile
|
@@ -259,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
259
245
|
- !ruby/object:Gem::Version
|
260
246
|
version: '0'
|
261
247
|
requirements: []
|
262
|
-
rubygems_version: 3.
|
248
|
+
rubygems_version: 3.2.22
|
263
249
|
signing_key:
|
264
250
|
specification_version: 4
|
265
251
|
summary: Multi-threaded job backend with database queuing for ruby.
|