ruby_job 0.1.1 → 0.1.2
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/.ruby-version +1 -1
- data/.travis.yml +2 -0
- data/README.md +29 -7
- data/lib/ruby_job/version.rb +1 -1
- data/ruby_job.gemspec +3 -2
- metadata +12 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e009f73864ad315c45ebbb3d85d1c06ef6e60753f592b79e0256af8b1ce11c2c
|
4
|
+
data.tar.gz: f7b6559ed2d8ba30b2aaf7736622d9bd7c2fe2710d743b09c3167765cea8c35b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7a4091bc07e2834818a8014a217fdd2621697218bde9eb8212e9c46d383611d6d11998f18e6964d98aa5fca25a191b8dad1403137f541ada0d3ed0b85d48001
|
7
|
+
data.tar.gz: dbb80928d879c59b35c595b5d2d1230987d25a43b1617dad210871aed8513871f24dc86ecb0febb0d0114101725bc8f29f1f0af6f0b7022b478cf01bdc6a9ed3
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.7
|
1
|
+
2.5.7
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -11,7 +11,7 @@ only supports an [In-Memory Job Store](https://github.com/mimperatore/ruby_job/b
|
|
11
11
|
implemented through a fast [Fibonacci Heap](https://github.com/mudge/fibonacci_heap).
|
12
12
|
|
13
13
|
The initial version, which supports only a single queue, runs **200% faster than Sucker Punch**, capable of processing **1,000,000** simple jobs in **28 seconds**
|
14
|
-
vs. Sucker Punch's 59 seconds (measured on
|
14
|
+
vs. Sucker Punch's 59 seconds (measured on a MacBook Pro 2.3GHz with 16GB of RAM).
|
15
15
|
|
16
16
|
Additional features are in the works, including:
|
17
17
|
- Support for multiple queues & queue priorities
|
@@ -102,6 +102,27 @@ To do so:
|
|
102
102
|
job.dequeue
|
103
103
|
```
|
104
104
|
|
105
|
+
### Job arguments
|
106
|
+
Your Job class' `#perform` method signature is:
|
107
|
+
```ruby
|
108
|
+
def perform(*args)
|
109
|
+
end
|
110
|
+
```
|
111
|
+
|
112
|
+
When you invoke `#perform_async` (or similar methods), the arguments passed in will get sent to `#perform`.
|
113
|
+
|
114
|
+
For example, `MyWorker.perform_async(1, 'hello world!', x: 7)` will end up calling `perform(1, 'hello world!', x: 7)` when the job runs.
|
115
|
+
|
116
|
+
**Note**: Whether and how the arguments are serialized depends on the JobStore being used. `RubyJob::InMemoryJobStore`, the only JobStore
|
117
|
+
currently shipped out of the box with this gem, has no need to serialize the arguments, given that everything runs in a single operating system
|
118
|
+
process. However, keep in mind that the `Job` class, which is used to represent instances of jobs to run, defines methods `#to_json` and
|
119
|
+
`.json_create(hash)` which use `JSON.dump` and `JSON.parse`, respectively, to marshall the arguments. If you're going to implement
|
120
|
+
your own JobStore, feel free to avail yourself of these methods.
|
121
|
+
|
122
|
+
**Pro Tip**: In order to ensure your job code is portable across different JobStore implementations (e.g. in case at some point you think
|
123
|
+
you'll need a persistent backing store such as Redis or Cassandra to keep track of your mission critical jobs), ensure the arguments
|
124
|
+
you pass serialize and deserialize as you'd expect.
|
125
|
+
|
105
126
|
### Schedule a Job for execution (asynchronously)
|
106
127
|
|
107
128
|
**Note:** Jobs are scheduled to nearest **millisecond** of the specified start time.
|
@@ -135,12 +156,13 @@ server = RubyJob::ThreadedServer.new(num_threads: 10, jobstore: MyWorker.jobstor
|
|
135
156
|
|
136
157
|
#### Server options
|
137
158
|
```ruby
|
138
|
-
server.set(wait: true)
|
159
|
+
server.set(wait: true, wait_delay: 0.5)
|
139
160
|
```
|
140
161
|
|
141
|
-
- `wait`[boolean]: determines whether the server should exit when there aren't any processable jobs in the queue. Defaults to `true`.
|
142
|
-
- `wait_delay`[float]: number of seconds to
|
162
|
+
- `wait`[boolean]: determines whether the server should wait or exit when there aren't any processable jobs in the queue. Defaults to `true`.
|
163
|
+
- `wait_delay`[float]: if the server is going to wait, the number of seconds to delay before looking for jobs again. Defaults to `0.5`.
|
143
164
|
|
165
|
+
**Note:** The `wait`/`wait_delay` parameters apply independently to each worker thread.
|
144
166
|
|
145
167
|
#### Starting the server
|
146
168
|
Queued jobs will only run when a Server, attached to the JobStore the jobs have been enqueued to, has been started.
|
@@ -180,15 +202,15 @@ that's been halted for a significant amount of time will pick up old jobs that m
|
|
180
202
|
ensure you take that into account in your job processing code if you care about this situation.
|
181
203
|
|
182
204
|
### Retries
|
183
|
-
|
184
|
-
returns a tuple indicating whether the job should be retried, and how long the retry delay should be: [do_retry, retry_delay]
|
205
|
+
By default, jobs that raise errors will be not be retried by default. To have jobs retry, the worker class must define a `retry?` method that
|
206
|
+
returns a tuple indicating whether the job should be retried, and how long the retry delay should be: `[do_retry, retry_delay]`
|
185
207
|
```ruby
|
186
208
|
MAX_RETRIES = 5
|
187
209
|
INITIAL_RETRY_DELAY = 0.5
|
188
210
|
|
189
211
|
def retry?(attempt:, error:)
|
190
212
|
# determine whether a retry is required, based on the attempt number and error passed in
|
191
|
-
do_retry = error.is_a?(
|
213
|
+
do_retry = error.is_a?(MyRetriableError) && (attempt < MAX_RETRIES)
|
192
214
|
|
193
215
|
[do_retry, INITIAL_RETRY_DELAY * 2**(attempt-1)] # exponential backoff
|
194
216
|
end
|
data/lib/ruby_job/version.rb
CHANGED
data/ruby_job.gemspec
CHANGED
@@ -5,6 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
require 'ruby_job/version'
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
|
+
spec.required_ruby_version = '>= 2.5.7'
|
8
9
|
spec.name = 'ruby_job'
|
9
10
|
spec.version = RubyJob::VERSION
|
10
11
|
spec.authors = ['Marco Imperatore']
|
@@ -26,8 +27,9 @@ Gem::Specification.new do |spec|
|
|
26
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
28
|
spec.require_paths = ['lib']
|
28
29
|
|
30
|
+
spec.add_dependency 'fibonacci_heap'
|
31
|
+
|
29
32
|
spec.add_development_dependency 'bundler', '~> 2.1'
|
30
|
-
spec.add_development_dependency 'byebug', '~> 11.0'
|
31
33
|
spec.add_development_dependency 'codecov', '~> 0.1'
|
32
34
|
spec.add_development_dependency 'guard', '~> 2.16'
|
33
35
|
spec.add_development_dependency 'guard-rspec', '~> 4.7'
|
@@ -35,5 +37,4 @@ Gem::Specification.new do |spec|
|
|
35
37
|
spec.add_development_dependency 'rspec', '~> 3.9'
|
36
38
|
spec.add_development_dependency 'rubocop', '~> 0.78'
|
37
39
|
spec.add_development_dependency 'timecop', '~> 0.9'
|
38
|
-
spec.add_dependency 'fibonacci_heap'
|
39
40
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_job
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marco Imperatore
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-01-
|
11
|
+
date: 2020-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: fibonacci_heap
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
type: :
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.1'
|
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
|
-
version: '
|
40
|
+
version: '2.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: codecov
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,20 +136,6 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0.9'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: fibonacci_heap
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - ">="
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :runtime
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - ">="
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
139
|
description: 'RubyJob is a framework for running jobs.
|
154
140
|
|
155
141
|
'
|
@@ -198,7 +184,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
198
184
|
requirements:
|
199
185
|
- - ">="
|
200
186
|
- !ruby/object:Gem::Version
|
201
|
-
version:
|
187
|
+
version: 2.5.7
|
202
188
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
203
189
|
requirements:
|
204
190
|
- - ">="
|