kinetic 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|