symphony 0.12.3 → 0.14.0
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
- 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