que 0.14.3 → 1.0.0.beta

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.
Files changed (102) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +2 -0
  3. data/CHANGELOG.md +108 -14
  4. data/LICENSE.txt +1 -1
  5. data/README.md +49 -45
  6. data/bin/command_line_interface.rb +239 -0
  7. data/bin/que +8 -82
  8. data/docs/README.md +2 -0
  9. data/docs/active_job.md +6 -0
  10. data/docs/advanced_setup.md +7 -64
  11. data/docs/command_line_interface.md +45 -0
  12. data/docs/error_handling.md +65 -18
  13. data/docs/inspecting_the_queue.md +30 -80
  14. data/docs/job_helper_methods.md +27 -0
  15. data/docs/logging.md +3 -22
  16. data/docs/managing_workers.md +6 -61
  17. data/docs/middleware.md +15 -0
  18. data/docs/migrating.md +4 -7
  19. data/docs/multiple_queues.md +8 -4
  20. data/docs/shutting_down_safely.md +1 -1
  21. data/docs/using_plain_connections.md +39 -15
  22. data/docs/using_sequel.md +5 -3
  23. data/docs/writing_reliable_jobs.md +15 -24
  24. data/lib/que.rb +98 -182
  25. data/lib/que/active_job/extensions.rb +97 -0
  26. data/lib/que/active_record/connection.rb +51 -0
  27. data/lib/que/active_record/model.rb +48 -0
  28. data/lib/que/connection.rb +179 -0
  29. data/lib/que/connection_pool.rb +78 -0
  30. data/lib/que/job.rb +107 -156
  31. data/lib/que/job_cache.rb +240 -0
  32. data/lib/que/job_methods.rb +168 -0
  33. data/lib/que/listener.rb +176 -0
  34. data/lib/que/locker.rb +466 -0
  35. data/lib/que/metajob.rb +47 -0
  36. data/lib/que/migrations.rb +24 -17
  37. data/lib/que/migrations/4/down.sql +48 -0
  38. data/lib/que/migrations/4/up.sql +265 -0
  39. data/lib/que/poller.rb +267 -0
  40. data/lib/que/rails/railtie.rb +14 -0
  41. data/lib/que/result_queue.rb +35 -0
  42. data/lib/que/sequel/model.rb +51 -0
  43. data/lib/que/utils/assertions.rb +62 -0
  44. data/lib/que/utils/constantization.rb +19 -0
  45. data/lib/que/utils/error_notification.rb +68 -0
  46. data/lib/que/utils/freeze.rb +20 -0
  47. data/lib/que/utils/introspection.rb +50 -0
  48. data/lib/que/utils/json_serialization.rb +21 -0
  49. data/lib/que/utils/logging.rb +78 -0
  50. data/lib/que/utils/middleware.rb +33 -0
  51. data/lib/que/utils/queue_management.rb +18 -0
  52. data/lib/que/utils/transactions.rb +34 -0
  53. data/lib/que/version.rb +1 -1
  54. data/lib/que/worker.rb +128 -167
  55. data/que.gemspec +13 -2
  56. metadata +37 -80
  57. data/.rspec +0 -2
  58. data/.travis.yml +0 -64
  59. data/Gemfile +0 -24
  60. data/docs/customizing_que.md +0 -200
  61. data/lib/generators/que/install_generator.rb +0 -24
  62. data/lib/generators/que/templates/add_que.rb +0 -13
  63. data/lib/que/adapters/active_record.rb +0 -40
  64. data/lib/que/adapters/base.rb +0 -133
  65. data/lib/que/adapters/connection_pool.rb +0 -16
  66. data/lib/que/adapters/pg.rb +0 -21
  67. data/lib/que/adapters/pond.rb +0 -16
  68. data/lib/que/adapters/sequel.rb +0 -20
  69. data/lib/que/railtie.rb +0 -16
  70. data/lib/que/rake_tasks.rb +0 -59
  71. data/lib/que/sql.rb +0 -170
  72. data/spec/adapters/active_record_spec.rb +0 -175
  73. data/spec/adapters/connection_pool_spec.rb +0 -22
  74. data/spec/adapters/pg_spec.rb +0 -41
  75. data/spec/adapters/pond_spec.rb +0 -22
  76. data/spec/adapters/sequel_spec.rb +0 -57
  77. data/spec/gemfiles/Gemfile.current +0 -19
  78. data/spec/gemfiles/Gemfile.old +0 -19
  79. data/spec/gemfiles/Gemfile.older +0 -19
  80. data/spec/gemfiles/Gemfile.oldest +0 -19
  81. data/spec/spec_helper.rb +0 -129
  82. data/spec/support/helpers.rb +0 -25
  83. data/spec/support/jobs.rb +0 -35
  84. data/spec/support/shared_examples/adapter.rb +0 -42
  85. data/spec/support/shared_examples/multi_threaded_adapter.rb +0 -46
  86. data/spec/unit/configuration_spec.rb +0 -31
  87. data/spec/unit/connection_spec.rb +0 -14
  88. data/spec/unit/customization_spec.rb +0 -251
  89. data/spec/unit/enqueue_spec.rb +0 -245
  90. data/spec/unit/helper_spec.rb +0 -12
  91. data/spec/unit/logging_spec.rb +0 -101
  92. data/spec/unit/migrations_spec.rb +0 -84
  93. data/spec/unit/pool_spec.rb +0 -365
  94. data/spec/unit/run_spec.rb +0 -14
  95. data/spec/unit/states_spec.rb +0 -50
  96. data/spec/unit/stats_spec.rb +0 -46
  97. data/spec/unit/transaction_spec.rb +0 -36
  98. data/spec/unit/work_spec.rb +0 -596
  99. data/spec/unit/worker_spec.rb +0 -167
  100. data/tasks/benchmark.rb +0 -3
  101. data/tasks/rspec.rb +0 -14
  102. data/tasks/safe_shutdown.rb +0 -67
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe Que, 'helpers' do
6
- it "should be able to clear the jobs table" do
7
- DB[:que_jobs].insert :job_class => "Que::Job"
8
- DB[:que_jobs].count.should be 1
9
- Que.clear!
10
- DB[:que_jobs].count.should be 0
11
- end
12
- end
@@ -1,101 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe "Logging" do
6
- it "by default should record the library and hostname and thread id in JSON" do
7
- Que.log :event => "blah", :source => 4
8
- $logger.messages.count.should be 1
9
-
10
- message = JSON.load($logger.messages.first)
11
- message['lib'].should == 'que'
12
- message['hostname'].should == Socket.gethostname
13
- message['pid'].should == Process.pid
14
- message['event'].should == 'blah'
15
- message['source'].should == 4
16
- message['thread'].should == Thread.current.object_id
17
- end
18
-
19
- it "should allow a callable to be set as the logger" do
20
- begin
21
- # Make sure we can get through a work cycle without a logger.
22
- Que.logger = proc { $logger }
23
-
24
- Que::Job.enqueue
25
- worker = Que::Worker.new
26
- sleep_until { worker.sleeping? }
27
-
28
- DB[:que_jobs].should be_empty
29
-
30
- worker.stop
31
- worker.wait_until_stopped
32
-
33
- $logger.messages.count.should be 2
34
- $logger.messages.map{|m| JSON.load(m)['event']}.should == ['job_worked', 'job_unavailable']
35
- ensure
36
- Que.logger = $logger
37
- end
38
- end
39
-
40
- it "should not raise an error when no logger is present" do
41
- begin
42
- # Make sure we can get through a work cycle without a logger.
43
- Que.logger = nil
44
-
45
- Que::Job.enqueue
46
- worker = Que::Worker.new
47
- sleep_until { worker.sleeping? }
48
-
49
- DB[:que_jobs].should be_empty
50
-
51
- worker.stop
52
- worker.wait_until_stopped
53
- ensure
54
- Que.logger = $logger
55
- end
56
- end
57
-
58
- it "should allow the use of a custom log formatter" do
59
- begin
60
- Que.log_formatter = proc { |data| "Logged event is #{data[:event]}" }
61
- Que.log :event => 'my_event'
62
- $logger.messages.count.should be 1
63
- $logger.messages.first.should == "Logged event is my_event"
64
- ensure
65
- Que.log_formatter = nil
66
- end
67
- end
68
-
69
- it "should not log anything if the logging formatter returns falsey" do
70
- begin
71
- Que.log_formatter = proc { |data| false }
72
-
73
- Que.log :event => "blah"
74
- $logger.messages.should be_empty
75
- ensure
76
- Que.log_formatter = nil
77
- end
78
- end
79
-
80
- it "should use a :level option to set the log level if one exists, or default to info" do
81
- begin
82
- Que.logger = o = Object.new
83
-
84
- def o.method_missing(level, message)
85
- $level = level
86
- $message = message
87
- end
88
-
89
- Que.log :message => 'one'
90
- $level.should == :info
91
- JSON.load($message)['message'].should == 'one'
92
-
93
- Que.log :message => 'two', :level => 'debug'
94
- $level.should == :debug
95
- JSON.load($message)['message'].should == 'two'
96
- ensure
97
- Que.logger = $logger
98
- $level = $message = nil
99
- end
100
- end
101
- end
@@ -1,84 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe Que::Migrations do
6
- it "should be able to perform migrations up and down" do
7
- # Migration #1 creates the table with a priority default of 1, migration
8
- # #2 ups that to 100.
9
-
10
- default = proc do
11
- result = Que.execute <<-SQL
12
- select adsrc::integer
13
- from pg_attribute a
14
- join pg_class c on c.oid = a.attrelid
15
- join pg_attrdef on adrelid = attrelid AND adnum = attnum
16
- where relname = 'que_jobs'
17
- and attname = 'priority'
18
- SQL
19
-
20
- result.first[:adsrc]
21
- end
22
-
23
- default.call.should == 100
24
- Que::Migrations.migrate! :version => 1
25
- default.call.should == 1
26
- Que::Migrations.migrate! :version => 2
27
- default.call.should == 100
28
-
29
- # Clean up.
30
- Que.migrate!
31
- end
32
-
33
- it "should be able to get and set the current schema version" do
34
- Que::Migrations.db_version.should == Que::Migrations::CURRENT_VERSION
35
- Que::Migrations.set_db_version(59328)
36
- Que::Migrations.db_version.should == 59328
37
- Que::Migrations.set_db_version(Que::Migrations::CURRENT_VERSION)
38
- Que::Migrations.db_version.should == Que::Migrations::CURRENT_VERSION
39
- end
40
-
41
- it "should be able to cycle the jobs table all the way between nonexistent and current without error" do
42
- Que::Migrations.db_version.should == Que::Migrations::CURRENT_VERSION
43
- Que::Migrations.migrate! :version => 0
44
- Que::Migrations.db_version.should == 0
45
- Que.db_version.should == 0
46
- Que::Migrations.migrate!
47
- Que::Migrations.db_version.should == Que::Migrations::CURRENT_VERSION
48
-
49
- # The helper on the Que module does the same thing.
50
- Que.migrate! :version => 0
51
- Que::Migrations.db_version.should == 0
52
- Que.migrate!
53
- Que::Migrations.db_version.should == Que::Migrations::CURRENT_VERSION
54
- end
55
-
56
- it "should be able to honor the initial behavior of Que.drop!" do
57
- DB.table_exists?(:que_jobs).should be true
58
- Que.drop!
59
- DB.table_exists?(:que_jobs).should be false
60
-
61
- # Clean up.
62
- Que::Migrations.migrate!
63
- DB.table_exists?(:que_jobs).should be true
64
- end
65
-
66
- it "should be able to recognize a que_jobs table created before the versioning system" do
67
- DB.drop_table :que_jobs
68
- DB.create_table(:que_jobs){serial :id} # Dummy Table.
69
- Que::Migrations.db_version.should == 1
70
- DB.drop_table(:que_jobs)
71
- Que::Migrations.migrate!
72
- end
73
-
74
- it "should be able to honor the initial behavior of Que.create!" do
75
- DB.drop_table :que_jobs
76
- Que.create!
77
- DB.table_exists?(:que_jobs).should be true
78
- Que::Migrations.db_version.should == 1
79
-
80
- # Clean up.
81
- Que::Migrations.migrate!
82
- DB.table_exists?(:que_jobs).should be true
83
- end
84
- end
@@ -1,365 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe "Managing the Worker pool" do
6
- it "should log mode changes" do
7
- Que.mode = :sync
8
- Que.mode = :off
9
- Que.mode = :off
10
-
11
- $logger.messages.count.should be 3
12
- m1, m2, m3 = $logger.messages.map { |m| JSON.load(m) }
13
-
14
- m1['event'].should == 'mode_change'
15
- m1['value'].should == 'sync'
16
-
17
- m2['event'].should == 'mode_change'
18
- m2['value'].should == 'off'
19
-
20
- m3['event'].should == 'mode_change'
21
- m3['value'].should == 'off'
22
- end
23
-
24
- describe "Que.mode=" do
25
- describe ":off" do
26
- it "with worker_count 0 should not instantiate workers or hit the db" do
27
- Que.connection = nil
28
- Que.worker_count = 0
29
- Que.mode = :off
30
- Que::Worker.workers.should == []
31
- end
32
-
33
- it "with worker_count > 0 should not instantiate workers or hit the db" do
34
- Que.connection = nil
35
- Que.mode = :off
36
- Que.worker_count = 5
37
- Que.mode = :off
38
- Que::Worker.workers.should == []
39
- end
40
- end
41
-
42
- describe ":sync" do
43
- it "with worker_count 0 should not instantiate workers or hit the db" do
44
- Que.connection = nil
45
- Que.worker_count = 0
46
- Que.mode = :sync
47
- Que::Worker.workers.should == []
48
- end
49
-
50
- it "with worker_count > 0 should not instantiate workers or hit the db" do
51
- Que.connection = nil
52
- Que.mode = :sync
53
- Que.worker_count = 5
54
- Que.mode = :sync
55
- Que::Worker.workers.should == []
56
- end
57
-
58
- it "should make jobs run in the same thread as they are queued" do
59
- Que.mode = :sync
60
-
61
- ArgsJob.enqueue(5, :testing => "synchronous").should be_an_instance_of ArgsJob
62
- $passed_args.should == [5, {:testing => "synchronous"}]
63
- DB[:que_jobs].count.should be 0
64
- end
65
-
66
- it "should work fine with enqueuing jobs without a DB connection" do
67
- Que.connection = nil
68
- Que.mode = :sync
69
-
70
- ArgsJob.enqueue(5, :testing => "synchronous").should be_an_instance_of ArgsJob
71
- $passed_args.should == [5, {:testing => "synchronous"}]
72
- end
73
-
74
- it "should not affect jobs that are queued with specific run_ats" do
75
- Que.mode = :sync
76
-
77
- ArgsJob.enqueue(5, :testing => "synchronous", :run_at => Time.now + 60)
78
- DB[:que_jobs].select_map(:job_class).should == ["ArgsJob"]
79
- end
80
- end
81
-
82
- describe ":async" do
83
- it "with worker_count 0 should not instantiate workers or hit the db" do
84
- Que.connection = nil
85
- Que.worker_count = 0
86
- Que.mode = :async
87
- Que::Worker.workers.map{|w| [w.state, w.thread.status]}.should == []
88
- end
89
-
90
- it "with worker_count > 0 should instantiate workers and hit the db" do
91
- Que::Job.enqueue
92
- Que.worker_count = 5
93
- Que.mode = :async
94
- sleep_until { Que::Worker.workers.all? &:sleeping? }
95
- DB[:que_jobs].count.should == 0
96
- Que::Worker.workers.map{|w| [w.state, w.thread.status]}.should == [[:sleeping, 'sleep']] * 5
97
- end
98
-
99
- it "should wake a worker every Que.wake_interval seconds" do
100
- Que.worker_count = 4
101
- Que.mode = :async
102
- sleep_until { Que::Worker.workers.all? &:sleeping? }
103
- Que.wake_interval = 0.01 # 10 ms
104
- Que::Job.enqueue
105
- sleep_until { DB[:que_jobs].count == 0 }
106
- end
107
-
108
- it "should work jobs in the queue defined by the Que.queue_name config option" do
109
- begin
110
- Que::Job.enqueue 1
111
- Que::Job.enqueue 2, :queue => 'my_queue'
112
-
113
- Que.queue_name = 'my_queue'
114
-
115
- Que.mode = :async
116
- Que.worker_count = 2
117
-
118
- sleep_until { Que::Worker.workers.all? &:sleeping? }
119
- DB[:que_jobs].count.should be 1
120
-
121
- job = DB[:que_jobs].first
122
- job[:queue].should == ''
123
- job[:args].should == '[1]'
124
- ensure
125
- Que.queue_name = nil
126
- end
127
- end
128
- end
129
- end
130
-
131
- describe "Que.worker_count=" do
132
- describe "when the mode is :off" do
133
- it "should record the setting but not instantiate any workers" do
134
- Que.worker_count.should == 0
135
- Que.connection = nil
136
- Que.mode = :off
137
- Que::Worker.workers.should == []
138
-
139
- Que.worker_count = 4
140
- Que.worker_count.should == 4
141
- Que::Worker.workers.should == []
142
-
143
- Que.worker_count = 6
144
- Que.worker_count.should == 6
145
- Que::Worker.workers.should == []
146
-
147
- Que.worker_count = 2
148
- Que.worker_count.should == 2
149
- Que::Worker.workers.should == []
150
-
151
- Que.worker_count = 0
152
- Que.worker_count.should == 0
153
- Que::Worker.workers.should == []
154
- end
155
- end
156
-
157
- describe "when the mode is :sync" do
158
- it "should record the setting but not instantiate any workers" do
159
- Que.worker_count.should == 0
160
- Que.connection = nil
161
- Que.mode = :sync
162
- Que::Worker.workers.should == []
163
-
164
- Que.worker_count = 4
165
- Que.worker_count.should == 4
166
- Que::Worker.workers.should == []
167
-
168
- Que.worker_count = 6
169
- Que.worker_count.should == 6
170
- Que::Worker.workers.should == []
171
-
172
- Que.worker_count = 2
173
- Que.worker_count.should == 2
174
- Que::Worker.workers.should == []
175
-
176
- Que.worker_count = 0
177
- Que.worker_count.should == 0
178
- Que::Worker.workers.should == []
179
- end
180
- end
181
-
182
- describe "when the mode is :async" do
183
- it "should start hitting the DB when transitioning to a non-zero value" do
184
- Que.mode = :async
185
- Que::Job.enqueue
186
- Que.worker_count = 4
187
- sleep_until { Que::Worker.workers.all?(&:sleeping?) }
188
- Que::Worker.workers.map{|w| [w.state, w.thread.status]}.should == [[:sleeping, 'sleep']] * 4
189
- DB[:que_jobs].count.should == 0
190
- end
191
-
192
- it "should stop hitting the DB when transitioning to zero" do
193
- Que.mode = :async
194
- Que.worker_count = 4
195
- sleep_until { Que::Worker.workers.all?(&:sleeping?) }
196
- Que.connection = nil
197
- Que.worker_count = 0
198
- $logger.messages.map{|m| JSON.load(m).values_at('event', 'value')}.should ==
199
- [['mode_change', 'async'], ['worker_count_change', '4']] + [['job_unavailable', nil]] * 4 + [['worker_count_change', '0']]
200
- end
201
-
202
- it "should be able to scale down the number of workers gracefully" do
203
- Que.mode = :async
204
- Que.worker_count = 4
205
-
206
- workers = Que::Worker.workers.dup
207
- workers.count.should be 4
208
- sleep_until { Que::Worker.workers.all?(&:sleeping?) }
209
-
210
- Que.worker_count = 2
211
- Que::Worker.workers.count.should be 2
212
- sleep_until { Que::Worker.workers.all?(&:sleeping?) }
213
-
214
- workers[0..1].should == Que::Worker.workers
215
- workers[2..3].each do |worker|
216
- worker.should be_an_instance_of Que::Worker
217
- worker.thread.status.should == false
218
- end
219
-
220
- $logger.messages.map{|m| JSON.load(m).values_at('event', 'value')}.should ==
221
- [['mode_change', 'async'], ['worker_count_change', '4']] + [['job_unavailable', nil]] * 4 + [['worker_count_change', '2']]
222
- end
223
-
224
- it "should be able to scale up the number of workers gracefully" do
225
- Que.mode = :async
226
- Que.worker_count = 4
227
- workers = Que::Worker.workers.dup
228
- workers.count.should be 4
229
-
230
- sleep_until { Que::Worker.workers.all?(&:sleeping?) }
231
- Que.worker_count = 6
232
- Que::Worker.workers.count.should be 6
233
- sleep_until { Que::Worker.workers.all?(&:sleeping?) }
234
-
235
- workers.should == Que::Worker.workers[0..3]
236
-
237
- $logger.messages.map{|m| JSON.load(m).values_at('event', 'value')}.should ==
238
- [['mode_change', 'async'], ['worker_count_change', '4']] + [['job_unavailable', nil]] * 4 + [['worker_count_change', '6']] + [['job_unavailable', nil]] * 2
239
- end
240
- end
241
- end
242
-
243
- describe "Que.wake!" do
244
- it "when mode = :off should do nothing" do
245
- Que.connection = nil
246
- Que.mode = :off
247
- Que.worker_count = 4
248
- sleep_until { Que::Worker.workers.all? &:sleeping? }
249
- Que.wake!
250
- sleep_until { Que::Worker.workers.all? &:sleeping? }
251
- $logger.messages.map{|m| JSON.load(m).values_at('event', 'value')}.should ==
252
- [['mode_change', 'off'], ['worker_count_change', '4']]
253
- end
254
-
255
- it "when mode = :sync should do nothing" do
256
- Que.connection = nil
257
- Que.mode = :sync
258
- Que.worker_count = 4
259
- sleep_until { Que::Worker.workers.all? &:sleeping? }
260
- Que.wake!
261
- sleep_until { Que::Worker.workers.all? &:sleeping? }
262
- $logger.messages.map{|m| JSON.load(m).values_at('event', 'value')}.should ==
263
- [['mode_change', 'sync'], ['worker_count_change', '4']]
264
- end
265
-
266
- it "when mode = :async and worker_count = 0 should do nothing" do
267
- Que.connection = nil
268
- Que.mode = :async
269
- Que.worker_count = 0
270
- sleep_until { Que::Worker.workers.all? &:sleeping? }
271
- Que.wake!
272
- sleep_until { Que::Worker.workers.all? &:sleeping? }
273
- $logger.messages.map{|m| JSON.load(m).values_at('event', 'value')}.should ==
274
- [['mode_change', 'async'], ['worker_count_change', '0']]
275
- end
276
-
277
- it "when mode = :async and worker_count > 0 should wake up a single worker" do
278
- Que.mode = :async
279
- Que.worker_count = 4
280
- sleep_until { Que::Worker.workers.all? &:sleeping? }
281
-
282
- BlockJob.enqueue
283
- Que.wake!
284
-
285
- $q1.pop
286
- Que::Worker.workers.first.should be_working
287
- Que::Worker.workers[1..3].each { |w| w.should be_sleeping }
288
- DB[:que_jobs].count.should be 1
289
- $q2.push nil
290
-
291
- sleep_until { Que::Worker.workers.all? &:sleeping? }
292
- DB[:que_jobs].count.should be 0
293
- end
294
-
295
- it "when mode = :async and worker_count > 0 should be thread-safe" do
296
- Que.mode = :async
297
- Que.worker_count = 4
298
- sleep_until { Que::Worker.workers.all? &:sleeping? }
299
- threads = 4.times.map { Thread.new { 100.times { Que.wake! } } }
300
- threads.each(&:join)
301
- end
302
- end
303
-
304
- describe "Que.wake_all!" do
305
- it "when mode = :off should do nothing" do
306
- Que.connection = nil
307
- Que.mode = :off
308
- Que.worker_count = 4
309
- sleep_until { Que::Worker.workers.all? &:sleeping? }
310
- Que.wake_all!
311
- sleep_until { Que::Worker.workers.all? &:sleeping? }
312
- $logger.messages.map{|m| JSON.load(m).values_at('event', 'value')}.should ==
313
- [['mode_change', 'off'], ['worker_count_change', '4']]
314
- end
315
-
316
- it "when mode = :sync should do nothing" do
317
- Que.connection = nil
318
- Que.mode = :sync
319
- Que.worker_count = 4
320
- sleep_until { Que::Worker.workers.all? &:sleeping? }
321
- Que.wake_all!
322
- sleep_until { Que::Worker.workers.all? &:sleeping? }
323
- $logger.messages.map{|m| JSON.load(m).values_at('event', 'value')}.should ==
324
- [['mode_change', 'sync'], ['worker_count_change', '4']]
325
- end
326
-
327
- it "when mode = :async and worker_count = 0 should do nothing" do
328
- Que.connection = nil
329
- Que.mode = :async
330
- Que.worker_count = 0
331
- sleep_until { Que::Worker.workers.all? &:sleeping? }
332
- Que.wake_all!
333
- sleep_until { Que::Worker.workers.all? &:sleeping? }
334
- $logger.messages.map{|m| JSON.load(m).values_at('event', 'value')}.should ==
335
- [['mode_change', 'async'], ['worker_count_change', '0']]
336
- end
337
-
338
- # This spec requires at least four connections.
339
- it "when mode = :async and worker_count > 0 should wake up all workers" do
340
- Que.adapter = QUE_ADAPTERS[:pond]
341
-
342
- Que.mode = :async
343
- Que.worker_count = 4
344
- sleep_until { Que::Worker.workers.all? &:sleeping? }
345
-
346
- 4.times { BlockJob.enqueue }
347
- Que.wake_all!
348
- 4.times { $q1.pop }
349
-
350
- Que::Worker.workers.each{ |worker| worker.should be_working }
351
- 4.times { $q2.push nil }
352
-
353
- sleep_until { Que::Worker.workers.all? &:sleeping? }
354
- DB[:que_jobs].count.should be 0
355
- end if QUE_ADAPTERS[:pond]
356
-
357
- it "when mode = :async and worker_count > 0 should be thread-safe" do
358
- Que.mode = :async
359
- Que.worker_count = 4
360
- sleep_until { Que::Worker.workers.all? &:sleeping? }
361
- threads = 4.times.map { Thread.new { 100.times { Que.wake_all! } } }
362
- threads.each(&:join)
363
- end
364
- end
365
- end