liebre 0.1.21 → 0.2.1
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/.rspec +2 -0
- data/Gemfile.lock +9 -7
- data/{LICENSE → LICENSE.txt} +1 -1
- data/README.md +492 -195
- data/Rakefile +2 -0
- data/lib/liebre.rb +27 -16
- data/lib/liebre/actor.rb +11 -0
- data/lib/liebre/actor/consumer.rb +80 -0
- data/lib/liebre/actor/consumer/callback.rb +34 -0
- data/lib/liebre/actor/consumer/core.rb +80 -0
- data/lib/liebre/actor/consumer/reporter.rb +84 -0
- data/lib/liebre/actor/consumer/resources.rb +47 -0
- data/lib/liebre/actor/consumer/resources/config.rb +65 -0
- data/lib/liebre/actor/context.rb +40 -0
- data/lib/liebre/actor/context/declare.rb +44 -0
- data/lib/liebre/actor/context/handler.rb +44 -0
- data/lib/liebre/actor/publisher.rb +58 -0
- data/lib/liebre/actor/publisher/core.rb +42 -0
- data/lib/liebre/actor/publisher/reporter.rb +55 -0
- data/lib/liebre/actor/publisher/resources.rb +33 -0
- data/lib/liebre/actor/rpc/client.rb +88 -0
- data/lib/liebre/actor/rpc/client/core.rb +75 -0
- data/lib/liebre/actor/rpc/client/pending.rb +65 -0
- data/lib/liebre/actor/rpc/client/reporter.rb +71 -0
- data/lib/liebre/actor/rpc/client/resources.rb +62 -0
- data/lib/liebre/actor/rpc/client/task.rb +33 -0
- data/lib/liebre/actor/rpc/server.rb +74 -0
- data/lib/liebre/actor/rpc/server/callback.rb +28 -0
- data/lib/liebre/actor/rpc/server/core.rb +75 -0
- data/lib/liebre/actor/rpc/server/reporter.rb +72 -0
- data/lib/liebre/actor/rpc/server/resources.rb +53 -0
- data/lib/liebre/adapter.rb +8 -0
- data/lib/liebre/adapter/bunny.rb +23 -0
- data/lib/liebre/adapter/bunny/chan.rb +38 -0
- data/lib/liebre/adapter/bunny/conn.rb +32 -0
- data/lib/liebre/adapter/bunny/exchange.rb +20 -0
- data/lib/liebre/adapter/bunny/queue.rb +59 -0
- data/lib/liebre/adapter/interface.rb +26 -0
- data/lib/liebre/adapter/interface/chan.rb +29 -0
- data/lib/liebre/adapter/interface/conn.rb +21 -0
- data/lib/liebre/adapter/interface/exchange.rb +13 -0
- data/lib/liebre/adapter/interface/queue.rb +37 -0
- data/lib/liebre/bridge.rb +72 -0
- data/lib/liebre/bridge/channel_builder.rb +36 -0
- data/lib/liebre/config.rb +8 -38
- data/lib/liebre/engine.rb +61 -0
- data/lib/liebre/engine/builder.rb +48 -0
- data/lib/liebre/engine/repository.rb +56 -0
- data/lib/liebre/engine/state.rb +49 -0
- data/lib/liebre/runner.rb +15 -47
- data/lib/liebre/version.rb +1 -1
- data/liebre.gemspec +9 -7
- data/spec/integration/publish_and_consume_spec.rb +71 -0
- data/spec/integration/rpc_communication_spec.rb +81 -0
- data/spec/integration/start_twice_spec.rb +63 -0
- data/spec/liebre/actor/consumer_spec.rb +169 -0
- data/spec/liebre/actor/context/declare_spec.rb +69 -0
- data/spec/liebre/actor/context/handler_spec.rb +65 -0
- data/spec/liebre/actor/publisher_spec.rb +58 -0
- data/spec/liebre/actor/rpc/client_spec.rb +126 -0
- data/spec/liebre/actor/rpc/server_spec.rb +141 -0
- data/spec/liebre/adapter/bunny_spec.rb +66 -0
- data/spec/liebre/bridge_spec.rb +54 -0
- data/spec/liebre/engine/builder_spec.rb +42 -0
- data/spec/liebre/engine_spec.rb +90 -0
- data/spec/liebre/version_spec.rb +10 -0
- data/spec/spec_helper.rb +2 -9
- metadata +97 -58
- data/lib/liebre/common.rb +0 -7
- data/lib/liebre/common/utils.rb +0 -37
- data/lib/liebre/connection_manager.rb +0 -85
- data/lib/liebre/publisher.rb +0 -113
- data/lib/liebre/runner/consumers.rb +0 -46
- data/lib/liebre/runner/starter.rb +0 -44
- data/lib/liebre/runner/starter/consumer.rb +0 -129
- data/lib/liebre/runner/starter/consumer/handler.rb +0 -35
- data/lib/liebre/runner/starter/resources.rb +0 -45
- data/lib/liebre/runner/starter/resources/queue_builder.rb +0 -63
- data/lib/liebre/runner/starter/rpc.rb +0 -59
- data/lib/liebre/tasks.rb +0 -12
- data/spec/config/liebre.yml +0 -48
- data/spec/config/rabbitmq.yml +0 -35
- data/spec/integration_spec.rb +0 -76
- data/spec/liebre/config_spec.rb +0 -63
- data/spec/liebre/connection_manager_spec.rb +0 -44
- data/spec/liebre/publisher_spec.rb +0 -92
- data/spec/liebre/runner/consumers_spec.rb +0 -59
- data/spec/liebre/runner/starter/consumer_spec.rb +0 -145
- data/spec/liebre/runner/starter/resources/queue_builder_spec.rb +0 -69
- data/spec/liebre/runner/starter/resources_spec.rb +0 -38
- data/spec/liebre/runner/starter/rpc_spec.rb +0 -100
- data/spec/liebre/runner/starter_spec.rb +0 -70
- data/spec/liebre/runner_spec.rb +0 -54
data/Rakefile
ADDED
data/lib/liebre.rb
CHANGED
@@ -1,24 +1,35 @@
|
|
1
1
|
require "liebre/version"
|
2
|
-
|
2
|
+
|
3
|
+
require "liebre/adapter"
|
4
|
+
require "liebre/config"
|
5
|
+
|
6
|
+
require "liebre/bridge"
|
7
|
+
require "liebre/actor"
|
8
|
+
require "liebre/engine"
|
9
|
+
|
10
|
+
require "liebre/runner"
|
3
11
|
|
4
12
|
module Liebre
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
13
|
+
|
14
|
+
def self.start only: nil
|
15
|
+
runner = Runner.new(engine: Liebre.engine)
|
16
|
+
runner.run(only: only)
|
17
|
+
end
|
18
|
+
|
12
19
|
def self.config
|
13
20
|
@config ||= Config.new
|
14
21
|
end
|
15
|
-
|
16
|
-
def self.
|
17
|
-
|
22
|
+
|
23
|
+
def self.engine
|
24
|
+
@engine ||= Engine.new(config)
|
18
25
|
end
|
19
|
-
|
20
|
-
def self.
|
21
|
-
|
26
|
+
|
27
|
+
def self.repo
|
28
|
+
engine.repo
|
22
29
|
end
|
23
|
-
|
24
|
-
|
30
|
+
|
31
|
+
def self.configure
|
32
|
+
yield(config)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
data/lib/liebre/actor.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'concurrent'
|
2
|
+
|
3
|
+
require 'liebre/actor/consumer/resources'
|
4
|
+
require 'liebre/actor/consumer/callback'
|
5
|
+
require 'liebre/actor/consumer/core'
|
6
|
+
require 'liebre/actor/consumer/reporter'
|
7
|
+
|
8
|
+
module Liebre
|
9
|
+
module Actor
|
10
|
+
class Consumer
|
11
|
+
include Concurrent::Async
|
12
|
+
|
13
|
+
OPTS = {:block => false, :manual_ack => true}
|
14
|
+
|
15
|
+
def initialize context
|
16
|
+
super()
|
17
|
+
|
18
|
+
@context = context
|
19
|
+
end
|
20
|
+
|
21
|
+
def start() async.__start__(); end
|
22
|
+
def stop() async.__stop__(); end
|
23
|
+
|
24
|
+
def consume(info, meta, payload) async.__consume__(info, meta, payload); end
|
25
|
+
|
26
|
+
def ack(info, opts = {}) async.__ack__(info, opts); end
|
27
|
+
def nack(info, opts = {}) async.__nack__(info, opts); end
|
28
|
+
def reject(info, opts = {}) async.__reject__(info, opts); end
|
29
|
+
def failed(info, error) async.__failed__(info, error); end
|
30
|
+
|
31
|
+
def clean() async.__clean__(); end
|
32
|
+
|
33
|
+
def __start__
|
34
|
+
reporter.on_start { core.start }
|
35
|
+
end
|
36
|
+
def __stop__
|
37
|
+
reporter.on_stop { core.stop }
|
38
|
+
end
|
39
|
+
|
40
|
+
def __consume__ info, meta, payload
|
41
|
+
reporter.on_consume { core.consume(info, meta, payload) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def __ack__(info, opts)
|
45
|
+
reporter.on_ack { core.ack(info, opts) }
|
46
|
+
end
|
47
|
+
def __nack__(info, opts)
|
48
|
+
reporter.on_nack { core.nack(info, opts) }
|
49
|
+
end
|
50
|
+
def __reject__(info, opts)
|
51
|
+
reporter.on_reject { core.reject(info, opts) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def __failed__(info, error)
|
55
|
+
reporter.on_failed(error) { core.failed(info, error) }
|
56
|
+
end
|
57
|
+
|
58
|
+
def __clean__
|
59
|
+
reporter.on_clean { core.clean() }
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def core
|
65
|
+
@core ||= Core.new(self, resources, context, Callback)
|
66
|
+
end
|
67
|
+
|
68
|
+
def resources
|
69
|
+
Resources.new(context)
|
70
|
+
end
|
71
|
+
|
72
|
+
def reporter
|
73
|
+
@reporter ||= Reporter.new(context)
|
74
|
+
end
|
75
|
+
|
76
|
+
attr_reader :context
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Liebre
|
2
|
+
module Actor
|
3
|
+
class Consumer
|
4
|
+
class Callback
|
5
|
+
|
6
|
+
def initialize consumer, info
|
7
|
+
@consumer = consumer
|
8
|
+
@info = info
|
9
|
+
end
|
10
|
+
|
11
|
+
def ack opts = {}
|
12
|
+
consumer.ack(info, opts)
|
13
|
+
end
|
14
|
+
|
15
|
+
def nack opts = {}
|
16
|
+
consumer.nack(info, opts)
|
17
|
+
end
|
18
|
+
|
19
|
+
def reject opts = {}
|
20
|
+
consumer.reject(info, opts)
|
21
|
+
end
|
22
|
+
|
23
|
+
def failed error
|
24
|
+
consumer.failed(info, error)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :consumer, :info
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Liebre
|
2
|
+
module Actor
|
3
|
+
class Consumer
|
4
|
+
class Core
|
5
|
+
|
6
|
+
OPTS = {:block => false, :manual_ack => true}
|
7
|
+
|
8
|
+
def initialize consumer, resources, context, callback_class
|
9
|
+
@consumer = consumer
|
10
|
+
@resources = resources
|
11
|
+
@context = context
|
12
|
+
@callback_class = callback_class
|
13
|
+
end
|
14
|
+
|
15
|
+
def start
|
16
|
+
queue.subscribe(OPTS) do |info, meta, payload|
|
17
|
+
consumer.consume(info, meta, payload)
|
18
|
+
end
|
19
|
+
dead_queue
|
20
|
+
end
|
21
|
+
|
22
|
+
def stop
|
23
|
+
chan.close
|
24
|
+
end
|
25
|
+
|
26
|
+
def consume info, meta, payload
|
27
|
+
callback = callback_class.new(consumer, info)
|
28
|
+
|
29
|
+
handler.call(payload, meta, callback) do |error|
|
30
|
+
callback.failed(error)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def ack(info, opts) queue.ack(info, opts); end
|
35
|
+
def nack(info, opts) queue.nack(info, opts); end
|
36
|
+
def reject(info, opts) queue.reject(info, opts); end
|
37
|
+
|
38
|
+
def failed info, error
|
39
|
+
queue.reject(info, {})
|
40
|
+
end
|
41
|
+
|
42
|
+
def clean
|
43
|
+
queue.delete
|
44
|
+
exchange.delete
|
45
|
+
dead_queue.delete
|
46
|
+
dead_exchange.delete
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def queue
|
52
|
+
resources.queue
|
53
|
+
end
|
54
|
+
|
55
|
+
def exchange
|
56
|
+
resources.exchange
|
57
|
+
end
|
58
|
+
|
59
|
+
def dead_queue
|
60
|
+
resources.dead_queue
|
61
|
+
end
|
62
|
+
|
63
|
+
def dead_exchange
|
64
|
+
resources.dead_exchange
|
65
|
+
end
|
66
|
+
|
67
|
+
def chan
|
68
|
+
context.chan
|
69
|
+
end
|
70
|
+
|
71
|
+
def handler
|
72
|
+
context.handler
|
73
|
+
end
|
74
|
+
|
75
|
+
attr_reader :consumer, :resources, :context, :callback_class
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Liebre
|
2
|
+
module Actor
|
3
|
+
class Consumer
|
4
|
+
class Reporter
|
5
|
+
|
6
|
+
def initialize context
|
7
|
+
@context = context
|
8
|
+
end
|
9
|
+
|
10
|
+
def on_start
|
11
|
+
yield
|
12
|
+
logger.info("Consumer started: #{name}")
|
13
|
+
rescue Exception => error
|
14
|
+
logger.error("Error starting consumer: #{name}\n#{error.message}\n#{error.backtrace}")
|
15
|
+
raise error
|
16
|
+
end
|
17
|
+
|
18
|
+
def on_stop
|
19
|
+
yield
|
20
|
+
logger.info("Consumer stopped: #{name}")
|
21
|
+
rescue Exception => error
|
22
|
+
logger.error("Error stopping consumer: #{name}\n#{error.message}\n#{error.backtrace}")
|
23
|
+
raise error
|
24
|
+
end
|
25
|
+
|
26
|
+
def on_consume
|
27
|
+
yield
|
28
|
+
rescue Exception => error
|
29
|
+
logger.error("Error consuming: #{name}\n#{error.message}\n#{error.backtrace}")
|
30
|
+
raise error
|
31
|
+
end
|
32
|
+
|
33
|
+
def on_ack
|
34
|
+
yield
|
35
|
+
rescue Exception => error
|
36
|
+
logger.error("Error acking: #{name}\n#{error.message}\n#{error.backtrace}")
|
37
|
+
raise error
|
38
|
+
end
|
39
|
+
|
40
|
+
def on_nack
|
41
|
+
yield
|
42
|
+
rescue Exception => error
|
43
|
+
logger.error("Error nacking: #{name}\n#{error.message}\n#{error.backtrace}")
|
44
|
+
raise error
|
45
|
+
end
|
46
|
+
|
47
|
+
def on_reject
|
48
|
+
yield
|
49
|
+
rescue Exception => error
|
50
|
+
logger.error("Error rejecting: #{name}\n#{error.message}\n#{error.backtrace}")
|
51
|
+
raise error
|
52
|
+
end
|
53
|
+
|
54
|
+
def on_failed error
|
55
|
+
logger.error("Error on Consumer when handling a message #{name}\n#{error.message}\n#{error.backtrace}")
|
56
|
+
yield
|
57
|
+
rescue Exception => error
|
58
|
+
logger.error("Error handling consumer handler failure: #{name}\n#{error.message}\n#{error.backtrace}")
|
59
|
+
raise error
|
60
|
+
end
|
61
|
+
|
62
|
+
def on_clean
|
63
|
+
yield
|
64
|
+
rescue Exception => error
|
65
|
+
logger.error("Error cleaning consumer: #{name}\n#{error.message}\n#{error.backtrace}")
|
66
|
+
raise error
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def name
|
72
|
+
@name ||= context.name.inspect
|
73
|
+
end
|
74
|
+
|
75
|
+
def logger
|
76
|
+
@logger ||= context.logger
|
77
|
+
end
|
78
|
+
|
79
|
+
attr_reader :context
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'liebre/actor/consumer/resources/config'
|
2
|
+
|
3
|
+
module Liebre
|
4
|
+
module Actor
|
5
|
+
class Consumer
|
6
|
+
class Resources
|
7
|
+
|
8
|
+
def initialize context
|
9
|
+
@context = context
|
10
|
+
end
|
11
|
+
|
12
|
+
def queue
|
13
|
+
@queue ||= declare.queue(config.queue).tap do |queue|
|
14
|
+
declare.bind(queue, exchange, config.bind)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def exchange
|
19
|
+
@exchange ||= declare.exchange(config.exchange)
|
20
|
+
end
|
21
|
+
|
22
|
+
def dead_queue
|
23
|
+
@dead_queue ||= declare.queue(config.dead_queue).tap do |queue|
|
24
|
+
declare.bind(queue, dead_exchange)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def dead_exchange
|
29
|
+
@dead_exchange ||= declare.exchange(config.dead_exchange)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def declare
|
35
|
+
context.declare
|
36
|
+
end
|
37
|
+
|
38
|
+
def config
|
39
|
+
@config ||= Config.new(context.spec)
|
40
|
+
end
|
41
|
+
|
42
|
+
attr_reader :context
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Liebre
|
2
|
+
module Actor
|
3
|
+
class Consumer
|
4
|
+
class Resources
|
5
|
+
class Config
|
6
|
+
|
7
|
+
def initialize spec
|
8
|
+
@spec = spec
|
9
|
+
end
|
10
|
+
|
11
|
+
def queue
|
12
|
+
raw_queue.merge(:opts => dead_letter_opts)
|
13
|
+
end
|
14
|
+
|
15
|
+
def exchange
|
16
|
+
raw_exchange
|
17
|
+
end
|
18
|
+
|
19
|
+
def bind
|
20
|
+
spec.fetch(:bind, {})
|
21
|
+
end
|
22
|
+
|
23
|
+
def dead_queue
|
24
|
+
{:name => error_name,
|
25
|
+
:opts => raw_queue.fetch(:opts, {})}
|
26
|
+
end
|
27
|
+
|
28
|
+
def dead_exchange
|
29
|
+
{:name => error_name,
|
30
|
+
:type => "fanout",
|
31
|
+
:opts => raw_exchange.fetch(:opts, {})}
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def dead_letter_opts
|
37
|
+
raw_queue.fetch(:opts, {}).dup.tap do |opts|
|
38
|
+
opts[:arguments] = opts.
|
39
|
+
fetch(:arguments, {}).
|
40
|
+
merge("x-dead-letter-exchange" => error_name)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def error_name
|
45
|
+
@error_name ||= begin
|
46
|
+
raw_name = spec.fetch(:queue).fetch(:name)
|
47
|
+
"#{raw_name}-error"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def raw_exchange
|
52
|
+
spec.fetch(:exchange)
|
53
|
+
end
|
54
|
+
|
55
|
+
def raw_queue
|
56
|
+
spec.fetch(:queue)
|
57
|
+
end
|
58
|
+
|
59
|
+
attr_reader :spec
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|