symphony 0.12.3 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.rdoc +39 -0
- data/Manifest.txt +1 -2
- data/{README.rdoc → README.md} +28 -14
- data/Rakefile +5 -74
- data/USAGE.rdoc +27 -13
- data/lib/symphony.rb +1 -1
- data/lib/symphony/daemon.rb +2 -2
- data/lib/symphony/metrics.rb +1 -1
- data/lib/symphony/mixins.rb +1 -1
- data/lib/symphony/queue.rb +18 -11
- data/lib/symphony/routing.rb +1 -1
- data/lib/symphony/signal_handling.rb +1 -1
- data/lib/symphony/statistics.rb +1 -1
- data/lib/symphony/task.rb +26 -3
- data/lib/symphony/task_group.rb +1 -1
- data/lib/symphony/task_group/longlived.rb +22 -12
- data/lib/symphony/task_group/oneshot.rb +1 -1
- data/spec/helpers.rb +23 -7
- data/spec/symphony/daemon_spec.rb +2 -2
- data/spec/symphony/mixins_spec.rb +6 -2
- data/spec/symphony/queue_spec.rb +28 -2
- data/spec/symphony/routing_spec.rb +1 -1
- data/spec/symphony/statistics_spec.rb +1 -1
- data/spec/symphony/task_group/longlived_spec.rb +20 -16
- data/spec/symphony/task_group/oneshot_spec.rb +1 -1
- data/spec/symphony/task_group_spec.rb +1 -1
- data/spec/symphony/task_spec.rb +19 -2
- data/spec/symphony_spec.rb +1 -1
- metadata +50 -136
- metadata.gz.sig +0 -0
- data/ChangeLog +0 -1162
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a3df7405c545cb568ef001dd1287e51bc2e2de8184d8b5ef43204b5fca7599b
|
4
|
+
data.tar.gz: 2abfd45b2447a5660feae02c67f9bbd5d856a68ba69cd391c9b7101e9a1a4582
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2bf4f256cb6605cbadfb03e6432a61cd036bf372ce8c97db932e3eafef0d22d9a8bf3e6907c772a271258fee096a5b87fd9a8f285b03302e94d922d65ccbff4
|
7
|
+
data.tar.gz: e384f2e9edbb3dc43e773e8cfa69be3bd316c8cbfa233d7ee93ab3865c67e90110f223671775d7318282cbee3ccbfed7d3a3ab17581f51f17edcee212f519bfb
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/History.rdoc
CHANGED
@@ -1,3 +1,42 @@
|
|
1
|
+
= Release History for symphony
|
2
|
+
|
3
|
+
---
|
4
|
+
|
5
|
+
== v0.14.0 [2020-07-23] Michael Granger <ged@faeriemud.org>
|
6
|
+
|
7
|
+
Improvements:
|
8
|
+
|
9
|
+
- Allow `x-queue-type` to be specified for a `Task`. Thanks to
|
10
|
+
Alyssa Verkade <averkade@costar.com> for the patch.
|
11
|
+
|
12
|
+
|
13
|
+
== v0.13.0 [2020-03-09] Michael Granger <ged@faeriemud.org>
|
14
|
+
|
15
|
+
Improvements:
|
16
|
+
|
17
|
+
- Remove Yajl dependency in favor of stdlib json.
|
18
|
+
- Update for Ruby 2.7
|
19
|
+
|
20
|
+
Changes:
|
21
|
+
|
22
|
+
- Requires Ruby 2.6+
|
23
|
+
|
24
|
+
|
25
|
+
== v0.12.5 [2019-07-16] Michael Granger <ged@FaerieMUD.org>
|
26
|
+
|
27
|
+
Improvements:
|
28
|
+
|
29
|
+
- Rescue timeouts when adjusting workers
|
30
|
+
|
31
|
+
|
32
|
+
== v0.12.4 [2019-07-11] Michael Granger <ged@FaerieMUD.org>
|
33
|
+
|
34
|
+
Bugfixes:
|
35
|
+
|
36
|
+
- Be more paranoid about shared channels, and be defensive when using
|
37
|
+
the counting queue.
|
38
|
+
|
39
|
+
|
1
40
|
== v0.12.3 [2019-07-11] Michael Granger <ged@FaerieMUD.org>
|
2
41
|
|
3
42
|
Bugfixes:
|
data/Manifest.txt
CHANGED
data/{README.rdoc → README.md}
RENAMED
@@ -1,10 +1,19 @@
|
|
1
|
-
|
1
|
+
# symphony
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
home
|
4
|
+
: https://hg.sr.ht/~ged/Symphony
|
5
5
|
|
6
|
+
code
|
7
|
+
: https://hg.sr.ht/~ged/Symphony/browse
|
6
8
|
|
7
|
-
|
9
|
+
docs
|
10
|
+
: https://deveiate.org/code/symphony
|
11
|
+
|
12
|
+
github
|
13
|
+
: https://github.com/ged/symphony
|
14
|
+
|
15
|
+
|
16
|
+
## Description
|
8
17
|
|
9
18
|
Symphony is a subscription-based asynchronous job system. It
|
10
19
|
allows you to define jobs that watch for lightweight events from a
|
@@ -21,7 +30,7 @@ symphony-task::
|
|
21
30
|
require the process management that the symphony daemon provides.
|
22
31
|
|
23
32
|
|
24
|
-
|
33
|
+
## Synopsis
|
25
34
|
|
26
35
|
class WorkerTask < Symphony::Task
|
27
36
|
# Process all events
|
@@ -37,28 +46,33 @@ symphony-task::
|
|
37
46
|
For a more detailed description of usage, please refer to the USAGE document.
|
38
47
|
|
39
48
|
|
40
|
-
|
49
|
+
## Installation
|
41
50
|
|
42
51
|
gem install symphony
|
43
52
|
|
44
53
|
|
45
|
-
|
54
|
+
## Contributing
|
46
55
|
|
47
56
|
You can check out the current development source with Mercurial via its
|
48
|
-
|
49
|
-
|
57
|
+
[project page](https://hg.sr.ht/~ged/symphony). Or if you prefer Git, via
|
58
|
+
[its Github mirror](https://github.com/ged/symphony).
|
50
59
|
|
51
60
|
After checking out the source, run:
|
52
61
|
|
53
|
-
$ rake
|
62
|
+
$ rake setup
|
63
|
+
|
64
|
+
This task will install dependencies, and do any other necessary developer setup.
|
65
|
+
|
66
|
+
|
67
|
+
## Authors
|
54
68
|
|
55
|
-
|
56
|
-
|
69
|
+
- Michael Granger <ged@faeriemud.org>
|
70
|
+
- Mahlon E. Smith <mahlon@martini.nu>
|
57
71
|
|
58
72
|
|
59
|
-
|
73
|
+
## License
|
60
74
|
|
61
|
-
Copyright (c) 2011-
|
75
|
+
Copyright (c) 2011-2020, Michael Granger and Mahlon E. Smith
|
62
76
|
All rights reserved.
|
63
77
|
|
64
78
|
Redistribution and use in source and binary forms, with or without
|
data/Rakefile
CHANGED
@@ -1,79 +1,10 @@
|
|
1
|
-
#!/usr/bin/env rake
|
1
|
+
#!/usr/bin/env ruby -S rake
|
2
2
|
|
3
|
-
|
4
|
-
require 'hoe'
|
5
|
-
rescue LoadError
|
6
|
-
abort "This Rakefile requires hoe (gem install hoe)"
|
7
|
-
end
|
8
|
-
|
9
|
-
GEMSPEC = 'symphony.gemspec'
|
10
|
-
|
11
|
-
|
12
|
-
Hoe.plugin :mercurial
|
13
|
-
Hoe.plugin :signing
|
14
|
-
Hoe.plugin :deveiate
|
15
|
-
|
16
|
-
Hoe.plugins.delete :rubyforge
|
17
|
-
|
18
|
-
hoespec = Hoe.spec 'symphony' do |spec|
|
19
|
-
spec.readme_file = 'README.rdoc'
|
20
|
-
spec.history_file = 'History.rdoc'
|
21
|
-
spec.extra_rdoc_files = FileList[ '*.rdoc' ]
|
22
|
-
spec.spec_extras[:rdoc_options] = ['-f', 'fivefish', '-t', 'Symphony']
|
23
|
-
spec.spec_extras[:required_rubygems_version] = '>= 2.0.3'
|
24
|
-
spec.license 'BSD'
|
25
|
-
|
26
|
-
spec.developer 'Michael Granger', 'ged@FaerieMUD.org'
|
27
|
-
spec.developer 'Mahlon E. Smith', 'mahlon@martini.nu'
|
28
|
-
|
29
|
-
spec.dependency 'configurability', '~> 3.1'
|
30
|
-
spec.dependency 'loggability', '~> 0.11'
|
31
|
-
spec.dependency 'pluggability', '~> 0.4'
|
32
|
-
spec.dependency 'bunny', '~> 2.0'
|
33
|
-
spec.dependency 'sysexits', '~> 1.1'
|
34
|
-
spec.dependency 'yajl-ruby', '~> 1.3'
|
35
|
-
spec.dependency 'msgpack', '~> 1.0'
|
36
|
-
spec.dependency 'metriks', '~> 0.9'
|
37
|
-
spec.dependency 'rusage', '~> 0.2'
|
38
|
-
|
39
|
-
spec.dependency 'rspec', '~> 3.0', :developer
|
40
|
-
spec.dependency 'simplecov', '~> 0.8', :developer
|
41
|
-
spec.dependency 'timecop', '~> 0.8', :developer
|
42
|
-
|
43
|
-
spec.require_ruby_version( '>=2.0.0' )
|
44
|
-
spec.hg_sign_tags = true if spec.respond_to?( :hg_sign_tags= )
|
3
|
+
require 'rake/deveiate'
|
45
4
|
|
46
|
-
|
5
|
+
Rake::DevEiate.setup( 'symphony' ) do |project|
|
6
|
+
project.publish_to = 'deveiate:/usr/local/www/public/code'
|
7
|
+
project.required_ruby_version = '~> 2.6'
|
47
8
|
end
|
48
9
|
|
49
|
-
# Fix some Hoe retardedness
|
50
|
-
hoespec.spec.files.delete( '.gemtest' )
|
51
|
-
ENV['VERSION'] ||= hoespec.spec.version.to_s
|
52
|
-
|
53
|
-
# Run the tests before checking in
|
54
|
-
task 'hg:precheckin' => [ :check_history, :check_manifest, :gemspec, :spec ]
|
55
|
-
|
56
|
-
# Rebuild the ChangeLog immediately before release
|
57
|
-
task :prerelease => 'ChangeLog'
|
58
|
-
CLOBBER.include( 'ChangeLog' )
|
59
|
-
|
60
|
-
desc "Build a coverage report"
|
61
|
-
task :coverage do
|
62
|
-
ENV["COVERAGE"] = 'yes'
|
63
|
-
Rake::Task[:spec].invoke
|
64
|
-
end
|
65
|
-
|
66
|
-
|
67
|
-
task :gemspec => GEMSPEC
|
68
|
-
file GEMSPEC => hoespec.spec.files do |task|
|
69
|
-
spec = $hoespec.spec
|
70
|
-
spec.version = "#{spec.version.bump}.0.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
|
71
|
-
File.open( task.name, 'w' ) do |fh|
|
72
|
-
fh.write( spec.to_ruby )
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
task :default => :gemspec
|
77
|
-
|
78
|
-
CLOBBER.include( GEMSPEC.to_s )
|
79
10
|
|
data/USAGE.rdoc
CHANGED
@@ -79,14 +79,14 @@ calling #run on the class itself.
|
|
79
79
|
== The Simplest Task
|
80
80
|
|
81
81
|
#!/usr/bin/env ruby
|
82
|
-
|
82
|
+
|
83
83
|
require 'symphony'
|
84
|
-
|
84
|
+
|
85
85
|
class Test < Symphony::Task
|
86
|
-
|
86
|
+
|
87
87
|
# Process all events
|
88
88
|
subscribe_to '#'
|
89
|
-
|
89
|
+
|
90
90
|
def work( payload, metadata )
|
91
91
|
puts "I received an event: %p with a payload of %p" % [
|
92
92
|
metadata[ :delivery_info ][ :routing_key ],
|
@@ -95,7 +95,7 @@ calling #run on the class itself.
|
|
95
95
|
return true
|
96
96
|
end
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
Symphony.load_config( 'etc/config.yml' )
|
100
100
|
Test.run
|
101
101
|
|
@@ -239,13 +239,13 @@ By default, Symphony will try and create a queue based on the Class
|
|
239
239
|
name of the task. You can override this per-task.
|
240
240
|
|
241
241
|
class Test < Symphony::Task
|
242
|
-
|
242
|
+
|
243
243
|
# Process all events
|
244
244
|
subscribe_to '#'
|
245
|
-
|
245
|
+
|
246
246
|
# I don't want to connect to a 'test' queue, lets make it interesting:
|
247
247
|
queue_name 'shazzzaaaam'
|
248
|
-
|
248
|
+
|
249
249
|
def work( payload, metadata )
|
250
250
|
...
|
251
251
|
|
@@ -261,14 +261,28 @@ can tell a task to create a persistent queue instead of an auto-delete queue:
|
|
261
261
|
|
262
262
|
== Queue Re-binding
|
263
263
|
|
264
|
-
If you want Symphony to re-bind a worker's queue when it starts up, you call
|
264
|
+
If you want Symphony to re-bind a worker's queue when it starts up, you call
|
265
|
+
tell it to with +always_rebind+:
|
265
266
|
|
266
267
|
always_rebind true
|
267
268
|
|
268
|
-
Note that re-binding doesn't *unbind* from the existing pattern/s, so you'll
|
269
|
+
Note that re-binding doesn't *unbind* from the existing pattern/s, so you'll
|
269
270
|
need to account for this in the Task's +work+ method.
|
270
271
|
|
271
272
|
|
273
|
+
== Queue Type
|
274
|
+
|
275
|
+
If you're running a version of RabbitMQ that supports the `x-queue-type`
|
276
|
+
argument (e.g., for quorum queues), you can specify a value for it using the
|
277
|
+
`queue_type` declaration:
|
278
|
+
|
279
|
+
queue_type 'quorum'
|
280
|
+
|
281
|
+
Note that several other queue settings might not work with some kinds of
|
282
|
+
queues; the validity of the combination of the task's settings are left to
|
283
|
+
the implementor.
|
284
|
+
|
285
|
+
|
272
286
|
= Plugins
|
273
287
|
|
274
288
|
Plugins change or enhance the behavior of a Symphony::Task.
|
@@ -287,7 +301,7 @@ the process name to display a total count and jobs per second rate.
|
|
287
301
|
prepend Symphony::Metrics
|
288
302
|
# ...
|
289
303
|
end
|
290
|
-
|
304
|
+
|
291
305
|
|
292
306
|
== Routing
|
293
307
|
|
@@ -300,13 +314,13 @@ receive multiple message topics much easier to maintain and test.
|
|
300
314
|
|
301
315
|
class Test < Symphony::Task
|
302
316
|
include Symphony::Routing
|
303
|
-
|
317
|
+
|
304
318
|
on 'users.create', 'workstation.create' do |payload, metadata|
|
305
319
|
puts "A user or workstation wants to be created!"
|
306
320
|
# ...
|
307
321
|
return true
|
308
322
|
end
|
309
|
-
|
323
|
+
|
310
324
|
on 'users.delete' do |payload, metadata|
|
311
325
|
puts "A user wants to be deleted!"
|
312
326
|
return true
|
data/lib/symphony.rb
CHANGED
data/lib/symphony/daemon.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# -*- ruby -*-
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'configurability'
|
5
5
|
require 'loggability'
|
@@ -248,7 +248,7 @@ class Symphony::Daemon
|
|
248
248
|
self.log.info "Restarting task group for %p" % [ task_class ]
|
249
249
|
group.max_workers = max
|
250
250
|
group.restart_workers
|
251
|
-
|
251
|
+
end
|
252
252
|
|
253
253
|
|
254
254
|
### Shut down the workers for the specified task group.
|
data/lib/symphony/metrics.rb
CHANGED
data/lib/symphony/mixins.rb
CHANGED
data/lib/symphony/queue.rb
CHANGED
@@ -69,6 +69,7 @@ class Symphony::Queue
|
|
69
69
|
|
70
70
|
### Fetch a Hash of AMQP options.
|
71
71
|
def self::amqp_session_options
|
72
|
+
self.session_opts ||= self.defaults
|
72
73
|
opts = self.session_opts.merge({
|
73
74
|
logger: Loggability[ Bunny ],
|
74
75
|
})
|
@@ -149,13 +150,14 @@ class Symphony::Queue
|
|
149
150
|
|
150
151
|
### Create a new Queue for the specified +task_class+.
|
151
152
|
def initialize( task_class )
|
152
|
-
@name
|
153
|
-
@acknowledge
|
154
|
-
@consumer_tag
|
155
|
-
@routing_keys
|
156
|
-
@prefetch
|
157
|
-
@persistent
|
158
|
-
@always_rebind
|
153
|
+
@name = task_class.queue_name
|
154
|
+
@acknowledge = task_class.acknowledge
|
155
|
+
@consumer_tag = task_class.consumer_tag
|
156
|
+
@routing_keys = task_class.routing_keys
|
157
|
+
@prefetch = task_class.prefetch
|
158
|
+
@persistent = task_class.persistent
|
159
|
+
@always_rebind = task_class.always_rebind
|
160
|
+
@amqp_queue_type = task_class.queue_type
|
159
161
|
|
160
162
|
@amqp_queue = nil
|
161
163
|
@shutting_down = false
|
@@ -194,6 +196,10 @@ class Symphony::Queue
|
|
194
196
|
# Whether or not to re-bind the queue to the exchange during setup
|
195
197
|
attr_predicate :always_rebind
|
196
198
|
|
199
|
+
##
|
200
|
+
# The -x-queue-type of the queue, if any
|
201
|
+
attr_reader :amqp_queue_type
|
202
|
+
|
197
203
|
##
|
198
204
|
# The underlying Bunny::Queue this object manages
|
199
205
|
attr_reader :amqp_queue
|
@@ -255,19 +261,20 @@ class Symphony::Queue
|
|
255
261
|
exchange = self.class.amqp_exchange
|
256
262
|
channel = self.class.amqp_channel
|
257
263
|
created_queue = false
|
258
|
-
queue = nil
|
259
264
|
|
260
|
-
begin
|
261
|
-
|
265
|
+
queue = begin
|
266
|
+
existing_queue = channel.queue( self.name, passive: true )
|
262
267
|
channel.prefetch( prefetch_count )
|
263
268
|
self.log.info "Using pre-existing queue: %s" % [ self.name ]
|
269
|
+
existing_queue
|
264
270
|
rescue Bunny::NotFound => err
|
265
271
|
self.log.info "%s; creating a new queue instead." % [ err.message ]
|
266
272
|
created_queue = true
|
267
273
|
channel = self.class.reset_amqp_channel
|
268
274
|
channel.prefetch( prefetch_count )
|
269
275
|
|
270
|
-
|
276
|
+
arguments = { 'x-queue-type' => self.amqp_queue_type }.compact
|
277
|
+
channel.queue( self.name, auto_delete: !self.persistent, arguments: arguments )
|
271
278
|
end
|
272
279
|
|
273
280
|
if self.always_rebind? || created_queue
|
data/lib/symphony/routing.rb
CHANGED