ribbon-event_bus 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/defaults.yml +2 -1
- data/lib/ribbon/event_bus/instance.rb +9 -0
- data/lib/ribbon/event_bus/publishers/remote_resque_publisher.rb +0 -1
- data/lib/ribbon/event_bus/publishers/resque_publisher.rb +37 -11
- data/lib/ribbon/event_bus/subscription.rb +15 -10
- data/lib/ribbon/event_bus/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07d4601534a5d201e75d5c81367616d82e278c2e
|
4
|
+
data.tar.gz: de763f8aeb39610d210860de8050f6dd6a78327d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d1adb38016cc6bb5c59b9d345d147f2dc224d69de9bf166bc13a1a0e4c32869a84a3f3e362a163473551f54a88b1d90d1679838e5d0fcf99488b728063d7a36
|
7
|
+
data.tar.gz: 76a811606c9e92f8c87f6c9131ad7e20e8a011648729c8b86f2da4b053d2a34e5dfd1e8a347cbe50a01820837a15401c4e440d777e3b8098c3a54ce244e4eb29
|
data/config/defaults.yml
CHANGED
@@ -72,6 +72,15 @@ module Ribbon
|
|
72
72
|
_subscriptions_by_locators[locator]
|
73
73
|
end
|
74
74
|
|
75
|
+
def find_publisher(publisher)
|
76
|
+
klass = Publishers.load(publisher)
|
77
|
+
publishers && publishers.find { |pub| pub.is_a?(klass) }
|
78
|
+
end
|
79
|
+
|
80
|
+
def has_publisher?(publisher)
|
81
|
+
!!find_publisher(publisher)
|
82
|
+
end
|
83
|
+
|
75
84
|
def _register_subscription(subscription)
|
76
85
|
if _subscriptions_by_locators[subscription.locator]
|
77
86
|
# This is not expected to occur
|
@@ -5,13 +5,33 @@ module Ribbon::EventBus
|
|
5
5
|
class ResquePublisher < Publisher
|
6
6
|
config_key :resque
|
7
7
|
|
8
|
+
def initialize(instance=nil, params={})
|
9
|
+
super
|
10
|
+
_disallow_multiple_per_instance
|
11
|
+
end
|
12
|
+
|
8
13
|
def publish(event)
|
9
14
|
super
|
10
15
|
|
11
16
|
unless event.subscriptions.empty?
|
12
17
|
PublisherJob.set_queue(config.publisher_queue.to_sym)
|
13
|
-
|
14
|
-
|
18
|
+
Resque.enqueue(PublisherJob, event.serialize)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def subscription_queue_formatter
|
23
|
+
if config.subscription_queue_formatter?
|
24
|
+
formatter = config.subscription_queue_formatter
|
25
|
+
case formatter
|
26
|
+
when Array
|
27
|
+
formatter.last
|
28
|
+
when Proc
|
29
|
+
formatter
|
30
|
+
else
|
31
|
+
raise Errors::PublisherError, "Invalid subscription_queue_formatter: #{formatter.inspect}"
|
32
|
+
end
|
33
|
+
else
|
34
|
+
lambda { |subscription| "subscriptions_p#{subscription.priority}" }
|
15
35
|
end
|
16
36
|
end
|
17
37
|
|
@@ -20,24 +40,22 @@ module Ribbon::EventBus
|
|
20
40
|
@queue = queue
|
21
41
|
end
|
22
42
|
|
23
|
-
def self.perform(
|
43
|
+
def self.perform(serialized_event)
|
24
44
|
event = Event.deserialize(serialized_event)
|
25
45
|
instance = event.instance
|
26
46
|
|
47
|
+
publisher = instance.find_publisher(:resque)
|
48
|
+
raise Errors::PublisherError, 'No ResquePublisher found' unless publisher
|
49
|
+
queue_formatter = publisher.subscription_queue_formatter
|
50
|
+
|
27
51
|
instance.plugins.perform(:resque_publish, event) do |event|
|
28
52
|
event.subscriptions.each { |s|
|
29
|
-
SubscriptionJob.set_queue(
|
30
|
-
(sub_queue_format % {
|
31
|
-
event: event.name,
|
32
|
-
priority: s.priority
|
33
|
-
}).to_sym
|
34
|
-
)
|
35
|
-
|
53
|
+
SubscriptionJob.set_queue(queue_formatter.call(s).to_sym)
|
36
54
|
Resque.enqueue(SubscriptionJob, s.serialize, event.serialize)
|
37
55
|
}
|
38
56
|
end
|
39
57
|
end
|
40
|
-
end
|
58
|
+
end # PublisherJob
|
41
59
|
|
42
60
|
module SubscriptionJob
|
43
61
|
def self.set_queue(queue)
|
@@ -49,6 +67,14 @@ module Ribbon::EventBus
|
|
49
67
|
event = Event.deserialize(serialized_event)
|
50
68
|
subscription.handle(event)
|
51
69
|
end
|
70
|
+
end # SubscriptionJob
|
71
|
+
|
72
|
+
private
|
73
|
+
def _disallow_multiple_per_instance
|
74
|
+
if instance.has_publisher?(:resque)
|
75
|
+
raise Errors::PublisherError,
|
76
|
+
"cannot have multiple ResquePublishers in an EventBus instance"
|
77
|
+
end
|
52
78
|
end
|
53
79
|
end
|
54
80
|
end
|
@@ -14,14 +14,6 @@ module Ribbon::EventBus
|
|
14
14
|
attr_reader :priority
|
15
15
|
attr_reader :locator
|
16
16
|
|
17
|
-
PRIORITY_SYMBOL_TO_INTEGER_MAP = {
|
18
|
-
highest: 1,
|
19
|
-
high: 3,
|
20
|
-
medium: 5,
|
21
|
-
low: 7,
|
22
|
-
lowest: 10
|
23
|
-
}.freeze
|
24
|
-
|
25
17
|
def initialize(event_name, params={}, &block)
|
26
18
|
@event_name = event_name.to_sym
|
27
19
|
@_block = block
|
@@ -73,6 +65,19 @@ module Ribbon::EventBus
|
|
73
65
|
Digest::MD5.hexdigest(_path).to_sym
|
74
66
|
end
|
75
67
|
|
68
|
+
def _symbol_to_priority(sym)
|
69
|
+
(@__symbol_to_priority_map ||= _generate_priority_shortcut_map)[sym]
|
70
|
+
end
|
71
|
+
|
72
|
+
def _generate_priority_shortcut_map(max_priority=config.max_priority)
|
73
|
+
{}.tap { |map|
|
74
|
+
map.merge!(highest: 1, lowest: max_priority)
|
75
|
+
map[:medium] = (map[:lowest] / 2.0).ceil
|
76
|
+
map[:high] = (map[:medium] / 2.0).ceil
|
77
|
+
map[:low] = ((map[:lowest] + map[:medium]) / 2.0).ceil
|
78
|
+
}.freeze
|
79
|
+
end
|
80
|
+
|
76
81
|
############################################################################
|
77
82
|
# Parameter Evaluation Logic
|
78
83
|
#
|
@@ -106,13 +111,13 @@ module Ribbon::EventBus
|
|
106
111
|
|
107
112
|
# Evaluate an integer as a priority.
|
108
113
|
def _evaluate_priority_int(int)
|
109
|
-
raise Errors::InvalidPriorityError, int unless int > 0 && int <=
|
114
|
+
raise Errors::InvalidPriorityError, int unless int > 0 && int <= config.max_priority
|
110
115
|
int
|
111
116
|
end
|
112
117
|
|
113
118
|
# Evaluate a symbol as a priority.
|
114
119
|
def _evaluate_priority_symbol(sym)
|
115
|
-
if (priority =
|
120
|
+
if (priority = _symbol_to_priority(sym))
|
116
121
|
_evaluate_priority(priority)
|
117
122
|
else
|
118
123
|
raise Errors::InvalidPriorityError, sym.inspect
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ribbon-event_bus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Honer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ribbon-plugins
|