resque-lonely_job 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NDFmMjdkMzRmNmVhNWM4YTg1Y2JlNDkzNmViZjdlNjk3MTA2MWQ5Ng==
5
- data.tar.gz: !binary |-
6
- ODJhOTg3YWYyZjRiZTcyMmZlMmNhZjA4NjRjNzc4YmY5ZGNhNWI0ZQ==
2
+ SHA1:
3
+ metadata.gz: 77d6fb9e55406f71e625a51f3aed732858c53c30
4
+ data.tar.gz: 5428f1070c91a492eefd4b13eaf9ba9bb4d404fa
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- YWE2NzdlOTkwYTI1YTlkZmU0ZjhhNGM0M2EyMDdkZjM4ZmM5MTJlOWY5OWY3
10
- N2RkODI1YjQzMDg0MjA0YTQ4ZDRiNTVkNWQ3YTk2YTk4MGU3Y2ZkNmYwMWI3
11
- YjE2Yzc2NjBkMzFmZmI2MjUwNjBmY2MzZWIyNmM0YjVmZjQ0N2I=
12
- data.tar.gz: !binary |-
13
- MTBhZjY2MmZjNGE5MGZhNjYwYWFmNDViZWIzMzVmNzg0Y2I3OTUxMjA5YTcy
14
- ZTc1YjE5MGI5ZmVjN2ZlNTM4YjBkOWRlZDYzMDQxN2E1NDFjZWM0NDc5OGY1
15
- NDJiZmExNjM0MTAxMmM3OGQwZjgwNmQ4NWRkMWFiZTgxM2Q0N2Q=
6
+ metadata.gz: 5014e12936d857fec3009b2c8b017689a4c3e25765f3122a196d984d3fbc9fa07c1cf4591de26d5801716104b67b6948d08fdc59e52a8fb5aff73e91970b24b0
7
+ data.tar.gz: 57fbd6bcb2a2189bc382814751f29efd4b14071e059a4e50087a0c5e6e8ad8f7109d640ce0755bfd48566d7df40646430c2fdfc2415f83378d4615e7a2309ef1
@@ -1,3 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
data/README.md CHANGED
@@ -2,8 +2,12 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/wallace/resque-lonely_job.png)](https://travis-ci.org/wallace/resque-lonely\_job)
4
4
 
5
- A [Resque](https://github.com/resque/resque) plugin. Version 1.x Requires Resque >= 1.20.0 and < 1.25.0.
6
- Requires ruby 1.9.3.
5
+ A [Resque](https://github.com/resque/resque) plugin that implements [Semantic
6
+ Versioning](http://semver.org/).
7
+
8
+ Version 1.x Requires Resque >= 1.20.0 and < 1.25.0.
9
+
10
+ Requires a version of MRI Ruby >= 1.9.3.
7
11
 
8
12
  Ensures that for a given queue, only one worker is working on a job at any given
9
13
  time.
@@ -35,7 +39,7 @@ Or install it yourself as:
35
39
 
36
40
  #### Example #1 -- One job running per queue
37
41
 
38
- require 'resque/plugins/lonely_job'
42
+ require 'resque-lonely_job'
39
43
 
40
44
  class StrictlySerialJob
41
45
  extend Resque::Plugins::LonelyJob
@@ -54,7 +58,7 @@ Let's say you want the serial constraint to apply at a more granular
54
58
  level. Instead of applying at the queue level, you can overwrite the .redis\_key
55
59
  method.
56
60
 
57
- require 'resque/plugins/lonely_job'
61
+ require 'resque-lonely_job'
58
62
 
59
63
  class StrictlySerialJob
60
64
  extend Resque::Plugins::LonelyJob
@@ -112,7 +116,38 @@ where you have three jobs in the queue with two resque workers:
112
116
 
113
117
  #### Example #3 -- One job running per user-defined attribute with job ordering preserved
114
118
 
115
- TODO
119
+ The secret to preserving job order semantics is to remove critical data from the
120
+ resque job and store data in a separate redis list. Part of a running job's
121
+ responsibility will be to grab data off of the separate redis list needed for it
122
+ to complete its job.
123
+
124
+ +---------------------------------------------------+
125
+ | :serial_work for jobs associated with key A |
126
+ |---------------------------------------------------|
127
+ | data x | data y | data z | ... |
128
+ +---------------------------------------------------+
129
+
130
+ +---------------------------------------------------+
131
+ | :serial_work for jobs associated with key B |
132
+ |---------------------------------------------------|
133
+ | data m | data n | data o | ... |
134
+ +---------------------------------------------------+
135
+
136
+ +---------------------------------------------------+
137
+ | :serial_work |
138
+ |---------------------------------------------------|
139
+ | | | | |
140
+ | redis_key: | redis_key: | redis_key: | ... |
141
+ | A | A | B | |
142
+ | | | | |
143
+ | job 1 | job 2 | job 3 | |
144
+ +---------------------------------------------------+
145
+
146
+ It now doesn't matter whether job 1 and job 2 are re-ordered as whichever goes
147
+ first will perform an atomic pop on the redis list that contains the data needed
148
+ for its job (data x, data y, data z).
149
+
150
+ *NOTE*: Worker starvation and fairness is still possible as in Example 2.
116
151
 
117
152
  ## Contributing
118
153
 
@@ -1,7 +1,7 @@
1
1
  module Resque
2
2
  module Plugins
3
3
  module LonelyJob
4
- VERSION = "1.0.0"
4
+ VERSION = "1.0.1"
5
5
  end
6
6
  end
7
7
  end
@@ -14,11 +14,10 @@ Gem::Specification.new do |gem|
14
14
  gem.require_paths = ["lib"]
15
15
  gem.version = Resque::Plugins::LonelyJob::VERSION
16
16
 
17
- gem.add_dependency 'resque', '>= 1.20.0', '< 1.25.0'
18
- gem.add_development_dependency 'mock_redis', '~> 0.4.1'
17
+ gem.add_dependency 'resque', '>= 1.2'
18
+ gem.add_development_dependency 'mock_redis'
19
19
  gem.add_development_dependency 'rake'
20
20
  gem.add_development_dependency 'rspec'
21
- gem.add_development_dependency 'debugger'
22
21
  gem.add_development_dependency 'timecop'
23
22
 
24
23
  gem.description = <<desc
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-lonely_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan R. Wallace
@@ -14,97 +14,89 @@ dependencies:
14
14
  name: resque
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: 1.20.0
20
- - - <
21
- - !ruby/object:Gem::Version
22
- version: 1.25.0
19
+ version: '1.2'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: 1.20.0
30
- - - <
24
+ - - '>='
31
25
  - !ruby/object:Gem::Version
32
- version: 1.25.0
26
+ version: '1.2'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: mock_redis
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
- - - ~>
38
- - !ruby/object:Gem::Version
39
- version: 0.4.1
40
- type: :development
41
- prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - ~>
45
- - !ruby/object:Gem::Version
46
- version: 0.4.1
47
- - !ruby/object:Gem::Dependency
48
- name: rake
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ! '>='
31
+ - - '>='
52
32
  - !ruby/object:Gem::Version
53
33
  version: '0'
54
34
  type: :development
55
35
  prerelease: false
56
36
  version_requirements: !ruby/object:Gem::Requirement
57
37
  requirements:
58
- - - ! '>='
38
+ - - '>='
59
39
  - !ruby/object:Gem::Version
60
40
  version: '0'
61
41
  - !ruby/object:Gem::Dependency
62
- name: rspec
42
+ name: rake
63
43
  requirement: !ruby/object:Gem::Requirement
64
44
  requirements:
65
- - - ! '>='
45
+ - - '>='
66
46
  - !ruby/object:Gem::Version
67
47
  version: '0'
68
48
  type: :development
69
49
  prerelease: false
70
50
  version_requirements: !ruby/object:Gem::Requirement
71
51
  requirements:
72
- - - ! '>='
52
+ - - '>='
73
53
  - !ruby/object:Gem::Version
74
54
  version: '0'
75
55
  - !ruby/object:Gem::Dependency
76
- name: debugger
56
+ name: rspec
77
57
  requirement: !ruby/object:Gem::Requirement
78
58
  requirements:
79
- - - ! '>='
59
+ - - '>='
80
60
  - !ruby/object:Gem::Version
81
61
  version: '0'
82
62
  type: :development
83
63
  prerelease: false
84
64
  version_requirements: !ruby/object:Gem::Requirement
85
65
  requirements:
86
- - - ! '>='
66
+ - - '>='
87
67
  - !ruby/object:Gem::Version
88
68
  version: '0'
89
69
  - !ruby/object:Gem::Dependency
90
70
  name: timecop
91
71
  requirement: !ruby/object:Gem::Requirement
92
72
  requirements:
93
- - - ! '>='
73
+ - - '>='
94
74
  - !ruby/object:Gem::Version
95
75
  version: '0'
96
76
  type: :development
97
77
  prerelease: false
98
78
  version_requirements: !ruby/object:Gem::Requirement
99
79
  requirements:
100
- - - ! '>='
80
+ - - '>='
101
81
  - !ruby/object:Gem::Version
102
82
  version: '0'
103
- description: ! "Ensures that for a given queue, only one worker is working on a job
104
- at any given time.\n\nExample:\n\n require 'resque/plugins/lonely_job'\n\n class
105
- StrictlySerialJob\n extend Resque::Plugins::LonelyJob\n\n @queue = :serial_work\n\n
106
- \ def self.perform\n # only one at a time in this block, no parallelism allowed
107
- for this\n # particular queue\n end\n end\n"
83
+ description: |
84
+ Ensures that for a given queue, only one worker is working on a job at any given time.
85
+
86
+ Example:
87
+
88
+ require 'resque/plugins/lonely_job'
89
+
90
+ class StrictlySerialJob
91
+ extend Resque::Plugins::LonelyJob
92
+
93
+ @queue = :serial_work
94
+
95
+ def self.perform
96
+ # only one at a time in this block, no parallelism allowed for this
97
+ # particular queue
98
+ end
99
+ end
108
100
  email:
109
101
  - jonathan.wallace@gmail.com
110
102
  executables: []
@@ -131,17 +123,17 @@ require_paths:
131
123
  - lib
132
124
  required_ruby_version: !ruby/object:Gem::Requirement
133
125
  requirements:
134
- - - ! '>='
126
+ - - '>='
135
127
  - !ruby/object:Gem::Version
136
128
  version: '0'
137
129
  required_rubygems_version: !ruby/object:Gem::Requirement
138
130
  requirements:
139
- - - ! '>='
131
+ - - '>='
140
132
  - !ruby/object:Gem::Version
141
133
  version: '0'
142
134
  requirements: []
143
135
  rubyforge_project:
144
- rubygems_version: 2.1.11
136
+ rubygems_version: 2.0.14
145
137
  signing_key:
146
138
  specification_version: 4
147
139
  summary: A resque plugin that ensures that only one job for a given queue will be