kinetic 0.0.4 → 0.0.5
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/examples/simple_worker.rb +3 -1
- data/lib/kinetic/base.rb +25 -31
- data/lib/kinetic/cli.rb +1 -1
- data/lib/kinetic/configuration.rb +1 -0
- data/lib/kinetic/dsl.rb +4 -1
- data/lib/kinetic/dsl/serialization.rb +11 -0
- data/lib/kinetic/dsl/timed_events.rb +13 -0
- data/lib/kinetic/master.rb +3 -3
- data/lib/kinetic/publisher.rb +89 -3
- data/lib/kinetic/version.rb +1 -1
- data/lib/kinetic/worker.rb +12 -3
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e122b819ed7edf00284f34983a5c86871638256b
|
4
|
+
data.tar.gz: 320b36ce33d0ec79469250b62710fad9c363ecfb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6b6d4454c50f76b388c3e46cd0c6182b083d57b10871a2661da0056f5f0115709fc9d11fd92cc38d95851740ee87dc3bf98d80d4d80b8e1adbc61afdf048724
|
7
|
+
data.tar.gz: fd867edf038cd1514c775c397192dae3c8e5ee35696fb185c33adef8579b6f7ddb4d242286e1e331c1b061347a08927750f64c03ca97d1cd94c2e5ecdeefc045
|
data/examples/simple_worker.rb
CHANGED
data/lib/kinetic/base.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require 'logger'
|
3
3
|
require 'fileutils'
|
4
4
|
require 'yaml'
|
5
|
+
require 'singleton'
|
5
6
|
|
6
7
|
# external dependencies
|
7
8
|
require 'amqp'
|
@@ -9,6 +10,7 @@ require 'confstruct'
|
|
9
10
|
require 'kgio'
|
10
11
|
require 'active_support/core_ext/module/delegation'
|
11
12
|
require 'active_support/core_ext/hash/reverse_merge'
|
13
|
+
require 'active_support/concern'
|
12
14
|
require 'active_support/inflections'
|
13
15
|
require 'awesome_print'
|
14
16
|
require 'awesome_print/core_ext/logger'
|
@@ -21,57 +23,49 @@ require_relative '../kinetic/master'
|
|
21
23
|
require_relative '../kinetic/worker'
|
22
24
|
require_relative '../kinetic/dsl'
|
23
25
|
require_relative '../kinetic/errors'
|
26
|
+
require_relative '../kinetic/publisher'
|
24
27
|
|
25
28
|
module Kinetic
|
26
29
|
|
27
30
|
module Delegator
|
28
31
|
|
29
|
-
|
32
|
+
Kinetic::DSL.public_instance_methods.each.each { |m| delegate m, to: :application }
|
30
33
|
|
31
34
|
def application
|
32
|
-
Application
|
35
|
+
Application.instance
|
33
36
|
end
|
34
37
|
|
35
38
|
|
36
39
|
end
|
37
40
|
|
38
41
|
class Base
|
42
|
+
include Singleton
|
43
|
+
include Kinetic::DSL
|
44
|
+
|
45
|
+
def initialize
|
46
|
+
logger.info "Kinetic #{Kinetic::VERSION}"
|
47
|
+
logger.debug "Loading serializer #{config.serializer}"
|
48
|
+
require "kinetic/serializers/#{config.serializer.downcase}"
|
49
|
+
@serializer = Object.const_get("Kinetic::Serializers::#{config.serializer}")
|
50
|
+
end
|
39
51
|
|
40
|
-
|
41
|
-
include Kinetic::DSL
|
42
|
-
|
43
|
-
|
44
|
-
def after_fork_procs
|
45
|
-
@after_fork_procs ||= []
|
46
|
-
end
|
47
|
-
|
48
|
-
def exchanges
|
49
|
-
@exchanges ||= {}
|
50
|
-
end
|
51
|
-
|
52
|
-
def deserialize(message)
|
53
|
-
@serializer.deserialize(message)
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def set_serializer(serializer)
|
59
|
-
logger.debug "Loading serializer #{serializer}"
|
60
|
-
require "kinetic/serializers/#{serializer.downcase}"
|
61
|
-
@serializer = Object.const_get("Kinetic::Serializers::#{serializer}")
|
62
|
-
end
|
52
|
+
private
|
63
53
|
|
64
|
-
|
65
|
-
|
66
|
-
|
54
|
+
def direct
|
55
|
+
exchanges[:direct] ||= {}
|
56
|
+
end
|
67
57
|
|
58
|
+
def after_fork_procs
|
59
|
+
@after_fork_procs ||= []
|
68
60
|
end
|
69
61
|
|
70
|
-
def
|
71
|
-
|
62
|
+
def exchanges
|
63
|
+
@exchanges ||= {}
|
72
64
|
end
|
73
65
|
|
74
|
-
|
66
|
+
def timed_events
|
67
|
+
@timed_events ||= {}
|
68
|
+
end
|
75
69
|
|
76
70
|
end
|
77
71
|
|
data/lib/kinetic/cli.rb
CHANGED
data/lib/kinetic/dsl.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
require_relative 'dsl/configuration'
|
2
|
+
require_relative 'dsl/timed_events'
|
3
|
+
require_relative 'dsl/serialization'
|
2
4
|
module Kinetic
|
3
5
|
|
4
6
|
module DSL
|
5
7
|
|
6
8
|
include Configuration
|
9
|
+
include TimedEvents
|
10
|
+
include Serialization
|
7
11
|
|
8
12
|
def after_fork(&block)
|
9
13
|
raise Kinetic::Errors::BlockMissing unless block_given?
|
@@ -11,7 +15,6 @@ module Kinetic
|
|
11
15
|
end
|
12
16
|
|
13
17
|
|
14
|
-
|
15
18
|
# Defines a direct queue subscription. Direct queues do not allow fuzzy matching so all messages sent to this queue
|
16
19
|
# must exactly match the key.
|
17
20
|
#
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Kinetic
|
2
|
+
module DSL
|
3
|
+
module TimedEvents
|
4
|
+
|
5
|
+
# Creates a timed event that fired at the set interval. Can be used to broadcast messages
|
6
|
+
# to all connected workers.
|
7
|
+
def timed_event(label, interval, options={}, &block)
|
8
|
+
timed_events[label] = {interval: interval, options: options, block: block}
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/kinetic/master.rb
CHANGED
@@ -7,7 +7,7 @@ module Kinetic
|
|
7
7
|
WORKERS = {}
|
8
8
|
SIG_QUEUE = []
|
9
9
|
|
10
|
-
delegate :logger, :config, :set,
|
10
|
+
delegate :logger, :config, :set, to: :app
|
11
11
|
|
12
12
|
attr_reader :app, :reexecpid
|
13
13
|
|
@@ -32,7 +32,7 @@ module Kinetic
|
|
32
32
|
daemonize if config[:daemonize]
|
33
33
|
enable_logging!
|
34
34
|
logger.debug 'Configuration:'
|
35
|
-
logger.ap app.
|
35
|
+
logger.ap app.config.to_hash
|
36
36
|
proc_name 'master'
|
37
37
|
initialize_self_pipe!
|
38
38
|
initialize_signal_traps!
|
@@ -129,7 +129,7 @@ module Kinetic
|
|
129
129
|
begin
|
130
130
|
proc_name "worker-#{worker_nr}"
|
131
131
|
logger.debug 'Calling after fork procs'
|
132
|
-
after_fork_procs.each { |p| p.call }
|
132
|
+
app.send(:after_fork_procs).each { |p| p.call }
|
133
133
|
#noinspection RubyArgCount
|
134
134
|
worker.run
|
135
135
|
rescue => e
|
data/lib/kinetic/publisher.rb
CHANGED
@@ -1,6 +1,92 @@
|
|
1
1
|
require 'logger'
|
2
|
-
|
3
|
-
require 'msgpack'
|
4
2
|
require 'bunny'
|
3
|
+
require 'singleton'
|
4
|
+
require 'active_support/core_ext/module/delegation'
|
5
|
+
|
6
|
+
|
7
|
+
require_relative 'dsl/configuration'
|
8
|
+
require_relative './configuration'
|
9
|
+
|
10
|
+
module Kinetic
|
11
|
+
|
12
|
+
class Publisher
|
13
|
+
include Kinetic::DSL::Configuration
|
14
|
+
include Singleton
|
15
|
+
|
16
|
+
class << self
|
17
|
+
|
18
|
+
def method_missing(meth, *args, &block)
|
19
|
+
self.instance.send(meth, *args, &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
logger.debug "Using serializer #{config.serializer}"
|
26
|
+
require_relative "./serializers/#{config.serializer.to_s.downcase}"
|
27
|
+
@serializer = Kinetic::Serializers.const_get(config.serializer)
|
28
|
+
end
|
29
|
+
|
30
|
+
def publish_topic(key, message)
|
31
|
+
topic_exchange.publish(serialize(message), routing_key: key)
|
32
|
+
true
|
33
|
+
end
|
34
|
+
|
35
|
+
def publish_fanout(key, message)
|
36
|
+
fanout_exchange.publish(serialize(message), routing_key: key)
|
37
|
+
end
|
38
|
+
|
39
|
+
def publish_direct(key, message)
|
40
|
+
direct_exchange.publish(serialize(message), routing_key: key)
|
41
|
+
end
|
42
|
+
|
43
|
+
alias :publish :publish_direct
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def topic_exchange
|
48
|
+
exchange(:topic)
|
49
|
+
end
|
50
|
+
|
51
|
+
def fanout_exchange
|
52
|
+
exchange(:fanout)
|
53
|
+
end
|
54
|
+
|
55
|
+
def direct_exchange
|
56
|
+
exchange(:direct)
|
57
|
+
end
|
58
|
+
|
59
|
+
def serialize(message)
|
60
|
+
@serializer.serialize(message)
|
61
|
+
end
|
62
|
+
|
63
|
+
def deserialize(message)
|
64
|
+
@serializer.deserialize(message)
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def exchange(type)
|
70
|
+
Bunny::Exchange.new(channel, type, "#{config.name}.#{type}")
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
def channel
|
75
|
+
unless @connection
|
76
|
+
logger.info "Establishing publisher connection to amqp://#{config.host}:#{config.port}"
|
77
|
+
@connection = Bunny.new(host: config.host, port: config.port, threaded: false)
|
78
|
+
logger.debug 'Starting connection'
|
79
|
+
@connection.start
|
80
|
+
@channel = @connection.channel
|
81
|
+
end
|
82
|
+
@channel
|
83
|
+
end
|
84
|
+
|
85
|
+
def logger
|
86
|
+
@logger ||= Logger.new(File.join(config.root, config.log_file))
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
end
|
5
91
|
|
6
|
-
|
92
|
+
end
|
data/lib/kinetic/version.rb
CHANGED
data/lib/kinetic/worker.rb
CHANGED
@@ -29,6 +29,7 @@ module Kinetic
|
|
29
29
|
initialize_channel!(connection)
|
30
30
|
initialize_exchanges!
|
31
31
|
initialize_subscribers!
|
32
|
+
initialize_timed_events!
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
@@ -60,7 +61,7 @@ module Kinetic
|
|
60
61
|
logger.debug 'Initializing exchanges'
|
61
62
|
@exchanges = {}
|
62
63
|
prefix = config.name
|
63
|
-
app.exchanges.each_key do |name|
|
64
|
+
app.send(:exchanges).each_key do |name|
|
64
65
|
logger.debug " Initializing #{name} exchange"
|
65
66
|
@exchanges[name] = channel.send(name, "#{prefix}.#{name}")
|
66
67
|
end
|
@@ -68,12 +69,12 @@ module Kinetic
|
|
68
69
|
|
69
70
|
def initialize_subscribers!
|
70
71
|
logger.debug 'Initializing subscribers'
|
71
|
-
app.exchanges.each do |name, value|
|
72
|
+
app.send(:exchanges).each do |name, value|
|
72
73
|
logger.debug " Building subscribers for '#{name}' exchange"
|
73
74
|
value.each do |queue, block|
|
74
75
|
logger.debug " Initializing queue for '#{queue}'"
|
75
76
|
q = channel.queue(queue)
|
76
|
-
logger.debug " Binding queue to '#{name}' exchange"
|
77
|
+
logger.debug " Binding queue to '#{name}' exchange with routing_key '#{queue}'"
|
77
78
|
q.bind(exchanges[name], routing_key: queue)
|
78
79
|
logger.debug " Subscribing to messages for '#{queue}'"
|
79
80
|
q.subscribe do |meta, payload|
|
@@ -87,5 +88,13 @@ module Kinetic
|
|
87
88
|
end
|
88
89
|
end
|
89
90
|
|
91
|
+
def initialize_timed_events!
|
92
|
+
logger.debug 'Initializing timed events'
|
93
|
+
app.send(:timed_events).each do |label, event|
|
94
|
+
logger.debug " Creating timer for #{label}"
|
95
|
+
event[:timer] = EM.add_periodic_timer(event[:interval]) { event[:block].call }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
90
99
|
end
|
91
100
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kinetic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jarod Reid
|
@@ -186,6 +186,8 @@ files:
|
|
186
186
|
- lib/kinetic/configuration.rb
|
187
187
|
- lib/kinetic/dsl.rb
|
188
188
|
- lib/kinetic/dsl/configuration.rb
|
189
|
+
- lib/kinetic/dsl/serialization.rb
|
190
|
+
- lib/kinetic/dsl/timed_events.rb
|
189
191
|
- lib/kinetic/errors.rb
|
190
192
|
- lib/kinetic/master.rb
|
191
193
|
- lib/kinetic/publisher.rb
|
@@ -215,7 +217,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
215
217
|
version: '0'
|
216
218
|
requirements: []
|
217
219
|
rubyforge_project:
|
218
|
-
rubygems_version: 2.0.
|
220
|
+
rubygems_version: 2.0.14
|
219
221
|
signing_key:
|
220
222
|
specification_version: 4
|
221
223
|
summary: A powerful yet simple AMQP worker framework
|
@@ -223,3 +225,4 @@ test_files:
|
|
223
225
|
- spec/base_spec.rb
|
224
226
|
- spec/dsl_spec.rb
|
225
227
|
- spec/spec_helper.rb
|
228
|
+
has_rdoc:
|