Class: ZK::EventHandlerSubscription::Actor
- Inherits:
-
Base
- Object
- Subscription::Base
- Base
- ZK::EventHandlerSubscription::Actor
- Defined in:
- lib/zk/event_handler_subscription/actor.rb
Overview
Stealing some ideas from Celluloid, this event handler subscription (basically, the wrapper around the user block), will spin up its own thread for delivery, and use a queue. This gives us the basis for better concurrency (event handlers run in parallel), but preserves the underlying behavior that a single-event-thread ZK gives us, which is that a single callback block is inherently serial. Without this, you have to make sure your callbacks are either synchronized, or totally reentrant, so that multiple threads could be calling your block safely (which is really difficult, and annoying).
Using this delivery mechanism means that the block still must not block forever, however each event will "wait its turn" and all callbacks will receive their events in the same order (which is what ZooKeeper guarantees), just perhaps at different times.
Constant Summary
Constants inherited from Base
Base::ALL_EVENTS, Base::ALL_EVENT_SET
Instance Attribute Summary
Attributes inherited from Base
Attributes inherited from Subscription::Base
Instance Method Summary collapse
- #async? ⇒ Boolean
- #call(*args) ⇒ Object
-
#close ⇒ Object
calls unsubscribe and shuts down.
-
#initialize(parent, path, callback, opts = {}) ⇒ Actor
constructor
A new instance of Actor.
- #pause_before_fork_in_parent ⇒ Object
- #reopen_after_fork! ⇒ Object
- #resume_after_fork_in_parent ⇒ Object
- #unregister ⇒ Object
Methods included from Logger
#logger, wrapped_logger, wrapped_logger=
Methods inherited from Subscription::Base
Constructor Details
#initialize(parent, path, callback, opts = {}) ⇒ Actor
Returns a new instance of Actor.
22 23 24 25 |
# File 'lib/zk/event_handler_subscription/actor.rb', line 22 def initialize(parent, path, callback, opts={}) super @threaded_callback = ThreadedCallback.new(@callable) end |
Instance Method Details
#async? ⇒ Boolean
27 28 29 |
# File 'lib/zk/event_handler_subscription/actor.rb', line 27 def async? true end |
#call(*args) ⇒ Object
31 32 33 |
# File 'lib/zk/event_handler_subscription/actor.rb', line 31 def call(*args) @threaded_callback.call(*args) end |
#close ⇒ Object
calls unsubscribe and shuts down
36 37 38 |
# File 'lib/zk/event_handler_subscription/actor.rb', line 36 def close unregister end |
#pause_before_fork_in_parent ⇒ Object
51 52 53 54 55 56 57 |
# File 'lib/zk/event_handler_subscription/actor.rb', line 51 def pause_before_fork_in_parent synchronize do logger.debug { "#{self.class}##{__method__}" } @threaded_callback.pause_before_fork_in_parent super end end |
#reopen_after_fork! ⇒ Object
45 46 47 48 49 |
# File 'lib/zk/event_handler_subscription/actor.rb', line 45 def reopen_after_fork! logger.debug { "#{self.class}##{__method__}" } super @threaded_callback.reopen_after_fork! end |
#resume_after_fork_in_parent ⇒ Object
59 60 61 62 63 |
# File 'lib/zk/event_handler_subscription/actor.rb', line 59 def resume_after_fork_in_parent super logger.debug { "#{self.class}##{__method__}" } @threaded_callback.resume_after_fork_in_parent end |
#unregister ⇒ Object
40 41 42 43 |
# File 'lib/zk/event_handler_subscription/actor.rb', line 40 def unregister super @threaded_callback.shutdown end |