ribbon-event_bus 0.4.0 → 0.5.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
- data/lib/ribbon/event_bus/instance.rb +1 -1
- data/lib/ribbon/event_bus/publishers/async_resque_publisher.rb +78 -0
- data/lib/ribbon/event_bus/publishers/publisher.rb +1 -1
- data/lib/ribbon/event_bus/publishers/resque_publisher.rb +20 -14
- data/lib/ribbon/event_bus/publishers.rb +3 -1
- data/lib/ribbon/event_bus/version.rb +1 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4e3cc06e8e927ee8d9699026ce5616dc2596121
|
4
|
+
data.tar.gz: e826ceefcec880ea0afcdc15c7a7f055c5496176
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8df0d797c59cf738ef4fad03df797a9d71ad5c2bdac7cb16e2aec7f1a8870a7741196a4b051f3ddfa9f1cebe0397ddb0e45e37ea9c30c8c78f08ac41860c4d30
|
7
|
+
data.tar.gz: 267e799cd369659d1d209e1f12362a2fd2287ed757a602b2c6eb1928fd2a13427a8832ec7b3bf710a2c8da1c31b8847e8575ae02bffe82b377c655ba93f9b75b
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'resque'
|
2
|
+
require 'redis'
|
3
|
+
require 'celluloid/current'
|
4
|
+
|
5
|
+
module Ribbon::EventBus
|
6
|
+
module Publishers
|
7
|
+
class AsyncResquePublisher < Publisher
|
8
|
+
config_key :resque
|
9
|
+
|
10
|
+
attr_reader :resque
|
11
|
+
|
12
|
+
def initialize(instance=nil, params={})
|
13
|
+
super
|
14
|
+
@resque = config.resque? ? config.resque : Resque
|
15
|
+
PublisherWorker.supervise(args: [self], as: worker_id)
|
16
|
+
end
|
17
|
+
|
18
|
+
def worker_id
|
19
|
+
@__worker_id ||= "event_bus_resque_worker_#{object_id}".to_sym
|
20
|
+
end
|
21
|
+
|
22
|
+
##
|
23
|
+
# The suprvisor created in the initializer will restart the PublisherWorker
|
24
|
+
# but there can be a short period of time when the actor returned by
|
25
|
+
# Celluloid::Actor[...] is dead. To avoid that we sleep for a millisecond
|
26
|
+
# to give it time to create a new worker thread. We try three times before
|
27
|
+
# giving up.
|
28
|
+
#
|
29
|
+
# This should ensure that it's unlikely for a dead worker to be returned.
|
30
|
+
# However, if a dead worker is returned, then async calls will silently
|
31
|
+
# fail, allowing normal execution. This makes firing events best-effort.
|
32
|
+
def worker
|
33
|
+
w = Celluloid::Actor[worker_id]
|
34
|
+
|
35
|
+
3.times {
|
36
|
+
if w.dead?
|
37
|
+
sleep(0.001)
|
38
|
+
w = Celluloid::Actor[worker_id]
|
39
|
+
else
|
40
|
+
break
|
41
|
+
end
|
42
|
+
}
|
43
|
+
|
44
|
+
w
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Needs to exist for the ResquePublisher::PublisherJob to succeed.
|
49
|
+
def subscription_queue_formatter
|
50
|
+
ResquePublisher.subscription_queue_formatter(config)
|
51
|
+
end
|
52
|
+
|
53
|
+
def publish(event)
|
54
|
+
super
|
55
|
+
worker.async.publish(event) unless event.subscriptions.empty?
|
56
|
+
end
|
57
|
+
|
58
|
+
class PublisherWorker
|
59
|
+
include Celluloid
|
60
|
+
|
61
|
+
attr_reader :publisher
|
62
|
+
|
63
|
+
def initialize(publisher)
|
64
|
+
@publisher = publisher
|
65
|
+
end
|
66
|
+
|
67
|
+
def publish(event)
|
68
|
+
publisher.resque.enqueue_to(
|
69
|
+
publisher.config.publisher_queue.to_sym,
|
70
|
+
ResquePublisher::PublisherJob,
|
71
|
+
event.serialize,
|
72
|
+
:async_resque
|
73
|
+
)
|
74
|
+
end
|
75
|
+
end # PublisherWorker
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -20,31 +20,37 @@ module Ribbon::EventBus
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def subscription_queue_formatter
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
formatter
|
23
|
+
self.class.subscription_queue_formatter(config)
|
24
|
+
end
|
25
|
+
|
26
|
+
class << self
|
27
|
+
def subscription_queue_formatter(config)
|
28
|
+
if config.subscription_queue_formatter?
|
29
|
+
formatter = config.subscription_queue_formatter
|
30
|
+
case formatter
|
31
|
+
when Array
|
32
|
+
formatter.last
|
33
|
+
when Proc
|
34
|
+
formatter
|
35
|
+
else
|
36
|
+
raise Errors::PublisherError, "Invalid subscription_queue_formatter: #{formatter.inspect}"
|
37
|
+
end
|
30
38
|
else
|
31
|
-
|
39
|
+
lambda { |subscription| "subscriptions_p#{subscription.priority}" }
|
32
40
|
end
|
33
|
-
else
|
34
|
-
lambda { |subscription| "subscriptions_p#{subscription.priority}" }
|
35
41
|
end
|
36
|
-
end
|
42
|
+
end # Class Methods
|
37
43
|
|
38
44
|
module PublisherJob
|
39
45
|
def self.set_queue(queue)
|
40
46
|
@queue = queue
|
41
47
|
end
|
42
48
|
|
43
|
-
def self.perform(serialized_event)
|
49
|
+
def self.perform(serialized_event, publisher_name=:resque)
|
44
50
|
event = Event.deserialize(serialized_event)
|
45
51
|
instance = event.instance
|
46
52
|
|
47
|
-
publisher = instance.find_publisher(
|
53
|
+
publisher = instance.find_publisher(publisher_name)
|
48
54
|
raise Errors::PublisherError, 'No ResquePublisher found' unless publisher
|
49
55
|
queue_formatter = publisher.subscription_queue_formatter
|
50
56
|
|
@@ -78,4 +84,4 @@ module Ribbon::EventBus
|
|
78
84
|
end
|
79
85
|
end
|
80
86
|
end
|
81
|
-
end
|
87
|
+
end
|
@@ -10,6 +10,8 @@ module Ribbon::EventBus
|
|
10
10
|
'ribbon/event_bus/publishers/resque_publisher')
|
11
11
|
autoload(:RemoteResquePublisher,
|
12
12
|
'ribbon/event_bus/publishers/remote_resque_publisher')
|
13
|
+
autoload(:AsyncResquePublisher,
|
14
|
+
'ribbon/event_bus/publishers/async_resque_publisher')
|
13
15
|
|
14
16
|
module_function
|
15
17
|
def load_for_instance(instance)
|
@@ -49,4 +51,4 @@ module Ribbon::EventBus
|
|
49
51
|
ProcPublisher.new(&publisher_proc)
|
50
52
|
end
|
51
53
|
end
|
52
|
-
end
|
54
|
+
end
|
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.5.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-
|
11
|
+
date: 2015-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ribbon-plugins
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 0.2.4
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: celluloid
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.17.2
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 0.17.2
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: rails
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -163,6 +177,7 @@ files:
|
|
163
177
|
- lib/ribbon/event_bus/plugins/logging_plugin.rb
|
164
178
|
- lib/ribbon/event_bus/plugins/plugin.rb
|
165
179
|
- lib/ribbon/event_bus/publishers.rb
|
180
|
+
- lib/ribbon/event_bus/publishers/async_resque_publisher.rb
|
166
181
|
- lib/ribbon/event_bus/publishers/proc_publisher.rb
|
167
182
|
- lib/ribbon/event_bus/publishers/publisher.rb
|
168
183
|
- lib/ribbon/event_bus/publishers/remote_resque_publisher.rb
|